PHP sprintf против echo

я опубликовал вопрос ранее сегодня вечером -PHP Wordpress котировки вопрос где некоторые цитаты вызывали у меня некоторые проблемы.

был опубликован ответ, предлагающий использовать echo sprintf. Это выглядело очень чисто и позаботилось о любых проблемах с переменной и цитированием, которые могут возникнуть. Мой вопрос в том, в чем недостаток использования sprintf? Если есть?

почему мы используем echo если это обычно вызывает проблемы с смешиванием HTML и PHP. Для справки это было повторенное заявление:

echo "<img src='"; bloginfo('template_url'); echo "img/" . $f['mainImage'] . ".png' />";

и Эхо & sprintf:

echo sprintf(
    '<img src="%s/img/%s.png" />', 
    get_bloginfo('template_url'), 
    $f['mainImage']
);

5 ответов


это не утверждение echo, которое "вызывает" проблемы, это отсутствие информации, доступной новичкам, поэтому я попытаюсь объяснить их.

существует четыре способа указания строки в php:

  • использование одной цитаты

    $str = 'Hello World. This might be a php $variable';

    echo $str; // Outputs: Hello World. This might be a php $variable

поскольку строка была завернута в одинарную кавычку, PHP engine не будет пытаться интерпретировать $variable как фактическую переменную и содержание того, что вы посмотреть в кавычках будет вторит.

  • использование двойной кавычки

    $variable = 'random text'; $str = "Hello World. This will be interpreted as $variable";

    echo $str; // Outputs: Hello World. This will be interpreted as random text

в этом примере php попытается найти переменную с именем $variable и использовать ее содержимое в строке.

  • синтаксис Heredoc

Heredoc полезен для таких вещей, как то, что вы хотели сделать - у вас есть смесь переменных, одинарных кавычек, двойных кавычек и экранирование всего, что может быть беспорядком. Следовательно, хорошие люди php реализовали для нас следующий синтаксис:

$str = <<<EOF
<img src="$directory/images/some_image.gif" alt='this is alt text' />
<p>Hello!</p>
EOF;

что произойдет, так это то, что PHP engine попытается интерпретировать переменные (и функции, но я не буду публиковать примеры того, как это сделать, поскольку он доступен на php.net), однако вы обернули строку с

  • Nowdoc синтаксис

    $str = <<<'EOF' <p>Hello! This wants to be a $variable but it won't be interpreted as one!</p> EOF;

это то же самое, что использовать строку с одной кавычкой-никаких замен переменных не происходит, и чтобы указать что - то как nowdoc - просто оберните разделитель символами с одной кавычкой, как показано в Примере.

если вы в состоянии понять эти четыре принципа, проблемы с кавычками в вашей строке должны уйти :)


основным недостатком является скорость. Но в большинстве случаев, это не имеет значения. Это было бы, только если бы вы печатали много информации, в большом цикле. sprintf-отличная функция, и вы должны ее использовать.

но лучше использовать printf вместо echo sprintf.


sprintf, вероятно, был предложен для возможностей форматирования, которые он дает вам. Я не знаю о каких-либо недостатках производительности sprintf; вероятно, он делает идентичный вызов C под капотом. Я согласен с оценкой Wiseguy, хотя printf-более простой способ сделать то же самое.


первый (sprintf) является более гибкой и реальной функцией. Последний - это языковая конструкция, менее гибкая, но более простая и быстрая в написании.

'echo', 'sprintf' и 'print' - это не функции, а языковые конструкции

'sprintf' принимает ввод по-разному: вы можете предоставить строку формата, а затем перечислить все необходимые входные данные.

для общих случаев разница не очевидна на первый взгляд, и довольно часто даже не соответствующие. В каком-то особенном дела 'sprintf' может быть лучше.

но echo процессы быстрее, чем sprintf.


если вы внимательно посмотрите на ответ, который вы ссылаетесь, исправление не имеет ничего общего с sprintf, Он, используя get_bloginfo() вместо bloginfo(), бывший возвращает строка, а не Эхо.

sprintf больше похож на стиль - Некоторые люди любят заменять свои переменные c-style %s format strings, другие любят использовать расширение переменных PHP в строковых литералах.