我今晚早些时候发布了一个问题 - PHP Wordpress quotes issue,其中一些引言引起了一些问题。
发布了一个回答,建议使用echo sprintf。这看起来很干净,照顾任何变量&引用可能发生的问题。我的问题是,使用sprintf的缺点是什么?如果有的话?
为什么我们使用echo
如果它通常会导致混合HTML和PHP的问题。作为参考,这是回音陈述:
echo "<img src='"; bloginfo('template_url'); echo "img/" . $f['mainImage'] . ".png' />";
和回声&amp; sprintf的:
echo sprintf(
'<img src="%s/img/%s.png" />',
get_bloginfo('template_url'),
$f['mainImage']
);
答案 0 :(得分:23)
这不是回声声明“导致”问题,而是缺乏新人可用的信息,所以我会尝试解释它们。
在php中有四种指定字符串的方法:
使用单引号
$str = 'Hello World. This might be a php $variable';
echo $str; // Outputs: Hello World. This might be a php $variable
由于字符串包含在单引号中,因此php引擎不会尝试将$ variable解释为实际变量,并且将回显引号中 see 的内容。
使用双引号
$variable = 'random text';
$str = "Hello World. This will be interpreted as $variable";
echo $str; // Outputs: Hello World. This will be interpreted as random text
在这个例子中,php将尝试查找名为$ variable的变量并在字符串中使用其内容。
Heredoc对于你想要做的事情很有用 - 你有各种变量,单引号,双引号和逃避所有这些可能是一团糟。因此,优秀的PHP人员为我们实现了以下语法:
$str = <<<EOF
<img src="$directory/images/some_image.gif" alt='this is alt text' />
<p>Hello!</p>
EOF;
将会发生的事情是PHP引擎将尝试解释变量(和函数,但我不会发布关于如何执行此操作的示例,因为它可以在php.net上获得),但是您使用&lt;&lt;来包装字符串。
Nowdoc语法
$str = <<<'EOF'
<p>Hello! This wants to be a $variable but it won't be interpreted as one!</p>
EOF;
与使用单引号字符串相同 - 不会发生变量替换,并将某些内容指定为nowdoc - 只需使用单引号字符包装分隔符,如示例所示。
如果您能够理解这四个原则,那么字符串中的引号问题就会消失:)
答案 1 :(得分:2)
主要缺点是速度。但在大多数情况下,这并不重要。只有当你在大循环中打印很多信息时才会这样。 sprintf是一个很棒的功能,你应该使用它。
但是使用printf而不是echo sprintf会更好。
答案 2 :(得分:2)
sprintf可能是为它提供的格式化功能而建议的。我不知道sprintf有任何性能劣势;它可能会在引擎盖下进行相同的C调用。我同意Wiseguy的评估,尽管printf是一种更直接的方式来做同样的事情。
答案 3 :(得分:2)
首先(sprintf)
更灵活,更实用。后者是一种语言结构,不太灵活,但更容易编写。
'echo','sprintf'和'print'不是函数,而是语言构造
'sprintf'以不同的方式输入:您可以提供格式字符串,然后列出所有必需的输入。
对于普通情况,乍看之下差异并不明显,而且往往甚至不相关。在某些特殊情况下,'sprintf'
会更好。
但echo
处理速度比sprintf.
答案 4 :(得分:0)
如果仔细查看您引用的答案,该修复程序与sprintf
无关,而是使用get_bloginfo()
代替bloginfo()
;前返回一个字符串而不是回显它。
sprintf更像是一种风格的东西 - 有些人喜欢用c风格的%s
格式字符串替换他们的变量,有些人喜欢在字符串文字中使用PHP的变量扩展。