PHP sprintf против эха

Вчера я опубликовал вопрос - 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']
);

Ответ 1

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

Существует четыре способа указания строки в 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), однако вы завернули строку с помощью & lt; & lt;

  • Синтаксис Nowdoc
$str = <<<'EOF'
    <p>Hello! This wants to be a $variable but it won't be interpreted as one!</p>
    EOF;

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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