这似乎是一个非常愚蠢的问题,但是PHP中存在printf()
函数的原因是什么?
在我看来,使用echo
将获得完全相同的结果,并且如果你在一行输出多个变量,你不会感到困惑的额外奖励(是的,你可以使用{ {1}}而不仅仅是%1$s
,但它仍然可以获得所有声明的几个变量的messey。
我知道你也可以定义变量的类型,而不需要在输出字符串之前修改它,但对我来说似乎不足以创建一个函数。
也许我错了,也许我错过了一些明显的东西,但如果有人可以帮助我理解为什么它存在(这样我就知道我是否应该真的使用它!)我会批评它。感谢。
答案 0 :(得分:10)
echo
是语言构造,printf
是一个函数。这意味着您将无法像echo
一样使用printf
。
这不仅仅是个人口味
查看两个功能的手册页:
这里讨论了这个主题,例如,你不能用变量函数调用echo
。此外,他们获得和管理输入的方式也不同。如果您不需要printf
提供的参数 FORMATTING ,则应使用echo
(稍快一点)。
我再次坚持使用一些关键字:格式化和功能。
printf
的使用不是连接字符串或从占位符构建字符串,而是使用自定义格式化(可能来自配置,用户输入或其他任何内容)。
我写了一些代码来解释我的意思(我发布的链接中的原始来源)。
此代码无效,echo
不是函数,因此不会返回打印值(您可以使用print
或sprintf
,但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_query
强制执行
在PHP 5.5中弃用了预备语句。最后一个精度:
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的内置格式函数。