14

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

在我看来, usingecho将获得完全相同的结果,如果您在一行上输出多个变量,您不会感到困惑(真的,您可以使用%1$s而不是 just %s,但它仍然可以声明了一些变量,弄得一团糟)。

我知道您也可以定义变量的类型,而无需在输出字符串之前对其进行修改,但对我而言,这似乎不足以阻止创建函数。

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

4

7 回答 7

11

echo是语言结构,printf是函数。这意味着您将无法以echoprintf.

这不仅仅是个人品味

查看这两个功能的手册页:

那里讨论了这个主题,例如,您不能echo使用变量函数调用。此外,他们获取和管理输入的方式也不同。如果您不需要您应该使用提供的参数FORMATTING(它会稍微快一些)。printfecho

例子

我再次强调一些关键词:formattingfunction。使用printfis 不是连接字符串或从占位符构建字符串,而是使用自定义格式(可能来自配置、用户输入或其他任何内容)来完成。

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

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

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

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

%format = "%'.-15.15s%'.6.6s\n";
printf($format, $heading1, $value1);
于 2012-05-15T11:08:36.963 回答
9

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) . "'";

这只是一个偏好问题!

于 2012-05-15T11:07:27.713 回答
4

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

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

  • 程序员的意图更加清晰和强制

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

       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格式和处理字符串的方式。所以你知道它对你有好处,对于那些已经知道的人来说,它更容易。因此,在这个主题上到处都有大量的文档和教程,还有一个维基百科页面:打印格式字符串

  • 字符串可以自动从您的数据中分离出来

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

您会发现类似的问题:

  • mysql 中的prepared statements 现在mysql_query在php 5.5 中被弃用,以支持prepared statements。
  • 所有模板语言:您的模板通常使用不同的语言,而另一端的数据则呈现模板。
  • 维基百科涵盖了更一般的主题:字符串插值

最后一个精度:

echo无非就是输出一个字符串。并printf进行字符串插值,并输出一个字符串。

所以公平地说,我们在这里比较的是通过字符串连接字符串插值构建字符串。因为用 . 输出字符串并没有错echo。所以这不是关于echo你如何制作你的字符串。即使像这样使用,您也在进行字符串插值echo

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

但是,那么,最后一种形式和:

printf("avg: %.3f", $avg);
于 2014-10-15T02:04:53.983 回答
2

printf可能存在是因为 PHP 是在 C 中创建的,并且printf传统上用于在 C 中输出格式化的字符串。 printf实际上可以做更多的事情,而不是echo因为它可以输出各种格式的变量,包括到某些位置的小数,甚至可能更多。

话虽如此,您可以使用 PHP 函数的某种组合来做任何可以做的事情printf,并且根据您的背景可能更有意义。

于 2012-05-15T11:08:42.937 回答
1

我只是解释一下我做了什么,以便您有一个明显的区别,我不是 PHP Pro,所以也许我错了,有更好或更简单的方法,而且我的示例可能对您没有那么有用出色地。

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

"这只猫有 %d 只小猫。" (英语)<=>“Katua %d kume ditu。” (尤斯克拉)

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

于 2012-06-21T00:56:49.873 回答
0

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

功能http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

于 2012-05-15T11:07:44.903 回答
0

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

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

你的愿望,你的风格:)

不是那个:

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

来自 C/C++ 背景的人知道很多格式字符串,例如 %f、%d、%.2f 等等!!!!!!!他们更喜欢 printf 来回显这种情况,因为这些浮点精度格式和其他格式将触手可及。与 PHP 的内置格式函数相比,他们更喜欢这些。

于 2012-05-15T11:10:49.850 回答