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 полезен для таких вещей, как то, что вы хотели сделать - у вас есть сочетание переменных, одинарных кавычек, двойных кавычек и экранирование всего, что может привести к путанице. Следовательно, хорошие php люди реализовали следующий синтаксис для нас:
$str = <<<EOF
<img src="$directory/images/some_image.gif" alt='this is alt text' />
<p>Hello!</p>
EOF;
Что произойдет, так это то, что движок PHP будет пытаться интерпретировать переменные (и функции), но я не буду публиковать примеры того, как это сделать, поскольку он доступен на php.net), однако вы завернули строку с помощью & lt; & lt;
$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 в строковых литералах.