PHP спринтф против эхо - PullRequest
       37

PHP спринтф против эхо

12 голосов
/ 14 апреля 2011

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

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

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

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

и echo & sprintf:

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

Ответы [ 5 ]

23 голосов
/ 14 апреля 2011

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

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

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

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

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

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

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

    $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 будет пытаться интерпретировать переменные (и функции, но я не буду публиковать примеры того, как это сделать, поскольку он доступен на php.net), однако вы завернули строку с

  • Синтаксис Nowdoc

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

Это то же самое, что использование строки в одинарных кавычках - замена переменных не происходит, а для указания чего-либо в качестве nowdoc - просто заключите разделитель в символы одинарных кавычек, как показано в примере.

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

2 голосов
/ 14 апреля 2011

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

2 голосов
/ 14 апреля 2011

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

'echo', 'sprintf' и 'print' не являются функциями, но языковые конструкции

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

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

Но echo обрабатывает быстрее, чем sprintf.

2 голосов
/ 14 апреля 2011

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

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

0 голосов
/ 14 апреля 2011

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

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

...