PHP sprintf与echo的区别

14

我今晚早些时候发布了一个问题 - PHP Wordpress quotes issue,其中一些引号引起了我的一些问题。

有人回答建议使用echo sprintf。这看起来非常简洁,并解决了可能出现的任何变量和引用问题。我的问题是,使用sprintf有什么缺点吗?如果有的话?

为什么我们要使用echo,如果它通常会导致混合HTML和PHP的问题。参考此处的echo语句:

echo "<img src='"; bloginfo('template_url'); echo "img/" . $f['mainImage'] . ".png' />";

和echo & sprintf:

echo sprintf(
    '<img src="%s/img/%s.png" />', 
    get_bloginfo('template_url'), 
    $f['mainImage']
);

6
为什么要使用 echo sprintf() 而不是简单地使用 printf() - Wiseguy
我同意Charles Brunet的观点。顺便说一下,在你的代码示例中,你使用了两个不同的函数。(bloginfo函数会自己执行echo/print操作,而get_bloginfo函数则返回信息)。第一个函数也可以写成:echo "<img src='" . get_bloginfo('template_url') . "img/" . $f['mainImage'] . ".png' />"; - Eliasdx
个人而言,既然您已经在使用双引号...为了清理echo语句,我会将echo更改为包含更少的连接符,但这只是一个随意的偏好。echo "<img src='".get_bloginfo('template_url')."img/{$f['mainImage']}.png' />"; - Anther
5个回答

25

语句“echo”并不会“导致”问题,问题出在新手没有足够的信息,所以我会尝试解释一下。

在php中有四种指定字符串的方式:

  • 使用单引号

    $str = 'Hello World. This might be a php $variable';

    echo $str; // 输出: Hello World. This might be a php $variable

由于字符串被单引号括起来,php引擎不会将$variable解释为实际变量,并且你看到的内容将被输出。

  • 使用双引号
$variable = 'random text';
$str = "Hello World. This will be interpreted as $variable";

echo $str; // 输出:Hello World。这将被解释为随机文本

在这个例子中,php会尝试查找一个名为$variable的变量,并使用它的内容在字符串中。

  • Heredoc语法

Heredoc语法对于像你想做的事情非常有用 - 你有各种变量、单引号、双引号和转义,而混合这些可能会很麻烦。因此,好的php人员为我们实现了以下语法:

$str = <<<EOF
<img src="$directory/images/some_image.gif" alt='this is alt text' />
<p>Hello!</p>
EOF;

What will happen is that PHP engine will try to interpret variables (and functions, but I won't post examples on how to do that since it's available at php.net), however you wrapped the string with <<

  • Nowdoc syntax
$str = <<<'EOF'
    <p>Hello! This wants to be a $variable but it won't be interpreted as one!</p>
    EOF;

It's the same as using a single-quoted string - no variable replacements occur, and to specify something as nowdoc - simply wrap the delimiter with single quote characters as shown in the example.

If you are able to understand these four principles, problems with quotes in your string should go away :)


3
主要缺点是速度。但在大多数情况下,这并不重要。只有在您需要打印大量信息时才会有所影响,如在一个大循环中。 sprintf 是一个很棒的函数,您应该使用它。
但是,与 echo sprintf 相比,使用 printf 会更好。

2

sprintf可能是因为它提供的格式化功能而被建议使用。我不知道sprintf是否存在任何性能劣势;在底层,它可能正在进行相同的C调用。然而,我同意Wiseguy的评估,即printf是完成相同任务的更直接的方法。


2

首先,(sprintf)更加灵活,是一个真正的函数。后者是一种语言结构,不够灵活,但编写起来更加简单快捷。

'echo'、'sprintf'和'print'不是函数,而是语言结构。

'sprintf'的输入方式不同:您可以提供格式字符串,然后列出所有所需的输入。

对于常见情况,差异并不明显,甚至通常也不相关。在某些特殊情况下,'sprintf'可能更好。

但是,echo的处理速度比sprintf更快。


0
如果您仔细查看您引用的答案,您会发现修复与 sprintf 没有任何关系,而是使用了 get_bloginfo() 而不是 bloginfo();前者返回一个字符串而不是回显它。
sprintf 更多的是一种风格问题 - 有些人喜欢用 c 风格的 %s 格式字符串替换变量,而另一些人则喜欢在字符串字面值中使用 PHP 的变量扩展。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接