PHP中printf()函数的用途是什么?

时间:2012-05-15 11:04:08

标签: php printf

这似乎是一个非常愚蠢的问题,但是PHP中存在printf()函数的原因是什么?

在我看来,使用echo将获得完全相同的结果,并且如果你在一行输出多个变量,你不会感到困惑的额外奖励(是的,你可以使用{ {1}}而不仅仅是%1$s,但它仍然可以获得所有声明的几个变量的messey。

我知道你也可以定义变量的类型,而不需要在输出字符串之前修改它,但对我来说似乎不足以创建一个函数。

也许我错了,也许我错过了一些明显的东西,但如果有人可以帮助我理解为什么它存在(这样我就知道我是否应该真的使用它!)我会批评它。感谢。

7 个答案:

答案 0 :(得分:10)

echo是语言构造,printf是一个函数。这意味着您将无法像echo一样使用printf

这不仅仅是个人口味

查看两个功能的手册页:

这里讨论了这个主题,例如,你不能用变量函数调用echo。此外,他们获得和管理输入的方式也不同。如果您不需要printf提供的参数 FORMATTING ,则应使用echo(稍快一点)。

实施例

我再次坚持使用一些关键字:格式化功能printf的使用不是连接字符串或从占位符构建字符串,而是使用自定义格式化(可能来自配置,用户输入或其他任何内容)。

我写了一些代码来解释我的意思(我发布的链接中的原始来源)。

此代码无效,echo不是函数,因此不会返回打印值(您可以使用printsprintf,但print不提供字符串连接)。

($some_var) ? echo 'true' : echo 'false';

以下代码打印格式化的字符串,在这种情况下,格式来自文字变量,但它可能来自(例如)GET请求或其他任何内容。你可以用echo和从配置中获取的格式字符串重写它吗?

%format = "%'.-15.15s%'.6.6s\n";
printf($format, $heading1, $value1);

答案 1 :(得分:8)

printf()是C的printf()函数的一个端口,所以有背景编写C代码的人更熟悉语法并且更喜欢它。 但是,大多数以PHP开头的人都觉得它很混乱。

进行比较:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
        mysql_real_escape_string($user),
        mysql_real_escape_string($password));

(我使用的是sprintf(),它与printf相同,但它实际上不会打印字符串,只是返回它)


$query = "SELECT * FROM users WHERE user='" . mysql_real_escape_string($user) . "' AND password='" . mysql_real_escape_string($password) . "'";

这只是一个偏好的问题!

答案 2 :(得分:3)

这是关于分离静态字符串和格式以及数据。

我所知道的每种编程语言都鼓励这种分离,因为:

  • 程序员的意图更加明确和强制执行

    意图很清楚:当您阅读本文时,您知道每个字段都在等待什么类型:

       printf("a: %.2f, b: %s, c: %d", $a, $b, $c)
    

    意图被强制执行:愚蠢的类型错误是有限的(就安全问题而言)。

  • 更安全

    因为它限制了意外元字符串的愚蠢注入:

       $avg = 3.1415;
       // $avg = '3</td><a href="http://www.badsite.com">pawned!</a>';
       printf("average: %.2f", $avg);
    

    在SQL中情况更糟......

  • 通常更容易阅读

    Appart比你有更多关于作家意图的线索,字符串    显然是一个独特的明确区块。数据被逐一清楚地列出    后。您不要过度使用".之类的内容。

  • 非常强大

    我很想知道在没有printf的情况下如何执行以下操作:

       printf("%.2f %5d", $v1, $v2);
    
  • 这是某种编程标准

    许多其他编程语言(C,C ++,Java,Python,Bash ......)都会有    类似的printf格式以及处理字符串的方式。    所以它对你有用了,对于那些已经知道的人来说,它更容易。    因此,到处都有大量的文档和教程    主题,以及它的维基百科页面:print format string

  • 字符串可以自动与您的数据分开

    这意味着它可用于翻译或语法修正。

您会发现类似的问题:

  • 在mysql中准备好的语句,现在使用mysql_query强制执行 在PHP 5.5中弃用了预备语句。
  • 所有模板语言:您通常使用不同语言的模板, 和另一边的数据来呈现模板。
  • 维基百科上涵盖了更为一般的主题:string interpolation

最后一个精度:

echo只会输出一个字符串。 printf进行字符串插值,并输出一个字符串。

所以公平地说,我们在这里通过字符串连接字符串插值比较构建字符串。因为用echo输出字符串没有错。所以这不是echo,而是你如何制作你的字符串。您正在使用字符串插值,即使在使用echo时也是如此:

echo sprintf("avg: %.3f", $avg);

但是,最后一种形式和之间没有什么区别:

printf("avg: %.3f", $avg);

答案 3 :(得分:2)

printf可能存在,因为PHP是用C创建的,printf传统上用于在C中输出格式化的字符串。printf实际上可以比echo做更多的事情。因为它可以输出各种格式的变量,包括小数到某些地方,可能还有很多。

话虽这么说,你可以做任何printf可以对某些PHP函数组合做的事情,根据你的背景情况可能更有意义。

答案 4 :(得分:1)

我只是解释一下我做了什么,所以你得到一个明显的区别,我不是PHP专业版,所以也许我错了,有更好或更简单的方法,而且我的例子也可能不那么有用也是你。

我将要翻译的每个字符串传递给一个函数,然后根据源字符串和当前语言返回已翻译的字符串,这样就可以翻译:

  

“这只猫有%d小猫。” (英文)&lt; =&gt; “Katua%d kume ditu。” (euskera)

事实是,无法翻译echo的分割字符串,因为数字之前的部分对于每种语言都不相同,因此必须将其翻译为“单个实体”。

答案 5 :(得分:0)

它是PHP语言继承的C的遗产

函数http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

答案 6 :(得分:0)

printf以不同的方式输入:您可以提供格式字符串,然后列出所有必需的输入(就像在C / C ++中一样)。

'echo'和'print'只接受字符串并且更容易使用。

你的愿望,你的风格:)

不是这样:

正如其他人所说,echo是一种语言结构,而printf是一种真正的功能, 你可以用printf做很多事。

来自C / C ++背景的人们知道很多格式字符串,比如%f,%d,%。。2f,什么不是!!!!! 他们更喜欢printf来回应这种情况,因为这些浮点精度格式和其他格式将是他们的指尖。 他们更喜欢这些而不是PHP的内置格式函数。