我试图了解更多关于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);
当然,这是一个额外的步骤,但如果你的条件检查做了一堆其他功能的事情,然后引号和追加开始在编码的功能。
我发现的最好的理由是,它允许你把所有的语言字符串放在你的语言文件中,人们可以根据需要翻译和排序它们-但你仍然知道,无论字符串的格式是什么-你希望显示用户的名字。
例如,您的网站会在页面顶部显示“欢迎返回[[User]]”。作为程序员,你不知道或不关心UI人员将如何编写它——你只知道用户名将显示在消息中的某个地方。
因此,您可以将消息嵌入到代码中,而不必担心该消息实际上是什么。
只需文件 (EN_US):
...
$lang['welcome_message'] = 'Welcome back %s';
...
然后,通过在实际的php代码中使用它,就可以支持任何语言的任何类型的消息。
sprintf($lang['welcome_message'], $user->name())
我通常使用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的另一个用途是在本地化的应用程序中,因为sprintf的参数不必按照它们在格式字符串中出现的顺序排列。
例子:
$color = 'blue';
$item = 'pen';
sprintf('I have a %s %s', $color, $item);
但是像法语这样的语言对单词的顺序是不同的:
$color = 'bleu';
$item = 'stylo';
sprintf('J\'ai un %2$s %1$s', $color, $item);
(是的,我的法语很烂:我在学校学过德语!)
实际上,您可以使用gettext来存储本地化的字符串,但您可以理解。