Какова цель функции printf() в PHP?
Это может показаться действительно глупым вопросом, но в чем причина существования функции printf()
в PHP?
Мне кажется, что использование echo
приведет к точно таким же результатам, с добавленным бонусом, который вы не смутите, если на одной строке выведено несколько переменных (true, вы можете использовать %1$s
в отличие от просто %s
, но он все равно может получить messey с несколькими переменными, все объявленные).
Я знаю, что вы также можете определить тип переменной без необходимости исправлять ее до вывода строки, но для меня это не кажется достаточным, чтобы warrent создать функцию.
Возможно, я ошибаюсь, может быть, мне не хватает чего-то очевидного, но если кто-то может помочь мне понять, почему он существует (чтобы я знал, действительно ли я должен его использовать!) Я бы это сделал. Спасибо.
Ответы
Ответ 1
printf() - это функция функции printf() для C, поэтому люди, которые получили код C, написанный на фоне, более знакомы с синтаксисом и предпочтут его.
Тем не менее, большинство людей, которые начинают с PHP, считают это довольно запутанным.
Для сравнения:
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
(Я использовал sprintf(), который совпадает с printf, но на самом деле он не будет печатать строку, он просто возвращает его)
$query = "SELECT * FROM users WHERE user='" . mysql_real_escape_string($user) . "' AND password='" . mysql_real_escape_string($password) . "'";
Это просто вопрос предпочтения!
Ответ 2
echo
- это языковая конструкция, printf
- это функция. Это означает, что вы не сможете использовать echo
так же, как printf
.
НЕ ТОЛЬКО ЛИЧНОЕ ВКУС
Взгляните на страницы руководства для обеих функций:
Этот раздел обсуждается там, например, вы не можете вызвать echo
с переменными функциями. Более того, способ ввода и управления входом отличается. Если вам не нужны параметры ФОРМАТИРОВАНИЕ, предоставляемые printf
, вы должны использовать echo
(это немного быстрее).
Примеры
Я снова настаиваю на некоторых ключевых словах: форматирование и функция.
Использование printf
заключается не в конкатенации строк или в построении строки из заполнителей, а в том, чтобы сделать это с помощью специального форматирования (возможно, из конфигурации, пользовательских входов или чего-то еще).
Я пишу код, чтобы объяснить, что я имею в виду (исходный источник в ссылках, которые я опубликовал).
Этот код недействителен, echo
не является функцией, поэтому он не вернет напечатанное значение (для этого вы можете использовать print
или sprintf
, но print
не обеспечивает конкатенацию строк).
($some_var) ? echo 'true' : echo 'false';
Следующий код печатает отформатированную строку, в этом случае формат исходит из литеральной переменной, но может возникнуть (например) запрос GET или что-то еще. Вы можете переписать его с помощью echo
и строки форматирования, взятой из конфигурации?
%format = "%'.-15.15s%'.6.6s\n";
printf($format, $heading1, $value1);
Ответ 3
Это о разделении статической строки и форматирования и данных.
Это разделение поощряется на каждом языке программирования, о котором я знаю, потому что:
-
намерение программиста более ясное и принудительное
ясно: когда вы читаете это, вы знаете, какой тип ожидается для каждого поля:
printf("a: %.2f, b: %s, c: %d", $a, $b, $c)
Применяется : ошибки глупого типа ограничены (как для проблем безопасности).
-
он более безопасный
Потому что он ограничивает глупую инъекцию неожиданных мета-строк:
$avg = 3.1415;
// $avg = '3</td><a href="http://www.badsite.com">pawned!</a>';
printf("average: %.2f", $avg);
Это намного хуже в SQL...
-
обычно гораздо легче читать
Appart, чем у вас есть дополнительные подсказки к намерению автора, строка явно находится в одном уникальном ясном блоке. Данные чисто перечислены один за другим после. Вы не злоупотребляете такими вещами, как "
, .
повсюду.
-
он очень мощный
Мне любопытно посмотреть, как вы сделаете следующее без printf
:
printf("%.2f %5d", $v1, $v2);
-
это своего рода стандарт программирования
Многие другие языки программирования (C, С++, Java, Python, Bash...) будут иметь аналогичный формат printf
и способ обработки строк. Так что это хорошо для вас, чтобы это знать, и для тех, кто уже знает, это проще. И, как следствие, во всем мире есть много документов и руководств. тема и страница wikipedia для него: строка формата печати
-
Строки могут быть отделены от ваших данных автоматически
И это означает, что он доступен для перевода или синтаксической коррекции.
Вы найдете похожие проблемы:
- подготовленные операторы в mysql, которые теперь применяются с
mysql_query
устарел в php 5.5 в пользу подготовленных операторов.
- Все языки шаблонов: где у вас есть шаблон, обычно в другом языке,
и данные на другой стороне, чтобы отобразить шаблон.
- Более общая тема освещена в wikipedia: строковая интерполяция
Последняя точность:
echo
делает не что иное, как вывод строки. И printf
выполняет строчную интерполяцию и выводит строку.
Итак, чтобы быть справедливым, мы здесь сравниваем строчную строку с помощью конкатенации строк и интерполяции строк. Поскольку нет ничего неправильного для вывода строки с помощью echo
. Так что это не о echo
, а о том, как вы делаете свою строку. Вы выполняете строчную интерполяцию даже при использовании echo
следующим образом:
echo sprintf("avg: %.3f", $avg);
Но тогда, нет никакой разницы между этой последней формой и:
printf("avg: %.3f", $avg);
Ответ 4
printf
, вероятно, существует, потому что PHP был создан на C, а printf
традиционно используется для вывода форматированных строк в C. printf
может фактически сделать намного больше, чем echo
, потому что он может выводить переменные в разнообразии форматов, включая десятичные знаки в определенные места и, возможно, намного больше.
При этом вы можете делать все, что printf
может делать с некоторой комбинацией функций PHP, и это может иметь большее значение в зависимости от вашего фона.
Ответ 5
Я просто объясню, что я сделал, чтобы у вас была явная разница, я не PHP Pro, поэтому, возможно, я ошибаюсь, и есть лучший или более простой подход, а также мой пример может быть не очень полезным для вас.
Я передаю каждую строку, которую я хочу перевести на функцию, и возвращает переведенную строку на основе исходной строки и текущего языка, таким образом она будет переводить:
"У кошки есть% d котят". (английский) <= > "Katua% d kume ditu." (Euskera)
Дело в том, что расщепленная строка для эха не может быть переведена, так как часть, предшествующая номеру, не одинакова для каждого языка, поэтому она должна быть переведена как "единая сущность".
Ответ 6
Это наследие из C, унаследованного языком PHP
function http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
Ответ 7
printf вводит разные значения: вы можете предоставить строку формата, а затем перечислить все необходимые данные (как в C/С++).
'echo' и 'print' принимают только строки и их проще использовать.
Ваше желание, Ваш стиль:)
НЕ ЭТО:
как говорят другие, echo - это языковая конструкция, а printf - реальная функция,
Вы можете сделать многое с printf.
Люди, приходящие с фона C/С++, знают множество строк формата, таких как% f,% d,%.2f, а что нет!!!!!
Они предпочли бы, чтобы printf эхо отзывался по этому сценарию, так как этот формат прецизионности с плавающей запятой и другие будут на своих пальцах.
Они предпочитают эти функции встроенного формата PHP.