我试图了解更多关于PHP函数sprintf(),但php.net没有帮助我,因为我仍然困惑,为什么要使用它?

看看下面的例子。

为什么用这个:

$output = sprintf("Here is the result: %s for this date %s", $result, $date);

当这样做是一样的,更容易写IMO:

$output = 'Here is the result: ' .$result. ' for this date ' .$date;

我是不是遗漏了什么?


当前回答

我用它来发送给用户的消息或其他“漂亮”类型的功能。例如,如果我知道我将使用用户的名字。

$name = 'Some dynamic name';

并在这种情况下使用多个消息。(例如,屏蔽或关注其他用户)

$messageBlock = 'You have blocked %s from accessing you.';
$messageFollow = 'Following %s is a great idea!';

你可以创建一个通用函数,对用户做一些事情,并添加这个字符串,无论句子的结构是什么,它都应该看起来很漂亮。我总是不喜欢仅仅把字符串附加在一起,不断地使用点符号,关闭和重新打开字符串,只是为了让一个句子看起来更好。我一开始是一个粉丝,像大多数人一样,但这似乎非常有用,当多个字符串需要被操纵,你不想硬编码变量的位置在每次。

想想看,哪个更好看?

return $messageOne === true ? $name.'. Please use the next example' : 'Hi '.$name.', how are you?'

Or

$message = $messageOne === true ? 'Option one %s' 
: ($messageTwo === true ? 'Option Two %s maybe?' : '%s you can choose from tons of grammatical instances and not have to edit variable placement and strings');

return sprintf($message, $name);

当然,这是一个额外的步骤,但如果你的条件检查做了一堆其他功能的事情,然后引号和追加开始在编码的功能。

其他回答

如前所述,它允许格式化输入数据。例如,强制2dp, 4位数字等。它对于构建MySQL查询字符串非常有用。

另一个优点是,它允许将字符串的布局与输入的数据分开,就像输入参数一样。例如,在MySQL查询的情况下:

// For security, you MUST sanitise ALL user input first, eg:
$username = mysql_real_escape_string($_POST['username']); // etc.
// Now creating the query:
$query = sprintf("INSERT INTO `Users` SET `user`='%s',`password`='%s',`realname`='%s';", $username, $passwd_hash, $realname);

当然,这种方法还有其他用途,比如将输出打印为HTML等。

编辑:出于安全原因,当使用上述技术时,必须在使用此方法之前使用mysql_real_escape_string()清除所有输入变量,以防止MySQL插入攻击。如果你解析未经处理的输入,你的网站和服务器就会被黑客攻击。(当然,那些完全由你的代码构造并保证安全的变量除外。)

我发现的最好的理由是,它允许你把所有的语言字符串放在你的语言文件中,人们可以根据需要翻译和排序它们-但你仍然知道,无论字符串的格式是什么-你希望显示用户的名字。

例如,您的网站会在页面顶部显示“欢迎返回[[User]]”。作为程序员,你不知道或不关心UI人员将如何编写它——你只知道用户名将显示在消息中的某个地方。

因此,您可以将消息嵌入到代码中,而不必担心该消息实际上是什么。

只需文件 (EN_US):

...
$lang['welcome_message'] = 'Welcome back %s';
...

然后,通过在实际的php代码中使用它,就可以支持任何语言的任何类型的消息。

sprintf($lang['welcome_message'], $user->name())

使用sprintf()格式化字符串更干净、更安全。

例如,在处理输入变量时,可以通过提前指定预期格式(例如,您期望字符串[%s]或数字[%d])来防止意外的意外。这可能有助于潜在的SQL注入风险,但它不会阻止如果字符串包含引号。

它还有助于处理浮点数,你可以显式地指定数字精度(例如%.2f),这可以节省你使用转换函数。

另一个优点是,大多数主流编程语言都有自己的sprintf()实现,因此一旦熟悉了它,它就更容易使用,而不是学习一门新的语言(比如如何连接字符串或转换浮点数)。

总之,这是一种很好的实践,可以让代码更清晰、更易读。

例如,请看下面的真实例子:

$insert .= "('".$tr[0]."','".$tr[0]."','".$tr[0]."','".$tr[0]."'),";

或者一些简单的例子,打印。' 1 ', ' 2 ', ' 3 ', ' 4 ':

print "foo: '" . $a . "','" . $b . "'; bar: '" . $c . "','" . $d . "'" . "\n";

和打印格式化字符串:

printf("foo: '%d','%d'; bar: '%d','%d'\n", $a, $b, $c, $d);

其中printf()相当于sprintf(),但它输出一个格式化的字符串而不是返回它(给变量)。

哪个更有可读性?

我通常使用sprintf来确保来自用户输入的id是一个整数,例如:

// is better use prepared statements, but this is practical sometimes
$query = sprintf("SELECT * from articles where id = %d;",$_GET['article_id']);

Also是用来做基本的模板(html邮件或其他东西),所以你可以在很多地方重用模板:

$mail_body = "Hello %s, ...";
$oneMail = sprintf($mail_body, "Victor");
$anotherMail = sprintf($mail_body, "Juan");

用不同的表示形式(八进制、控制小数点等)格式化数字也非常有用。

众所周知,sprintf有很多功能 一个例子如下:

几个月前,我需要将秒转换为小时:分钟:秒的格式 像$t = 494050 //秒,我想打印像137 h 14 m 10 s,所以我提出了php函数springf(),我只是保持秒在$t和回声sprintf(“%02d h %s%02d m %s%02d s”,地板($t/3600), $f, ($t/60)%60, $f, $t%60);得到137小时14米10秒

Sprintf()函数是一个非常有用的函数,如果我们知道如何使用它。