Какова цель функции printf () в PHP?

это может показаться действительно глупым вопросом, но в чем причина существования printf() функция в PHP?

мне кажется, что с помощью echo достигнет точно таких же результатов, с добавленным бонусом, который вы не запутаетесь, если у вас есть несколько переменных, выводимых на одной строке (true, вы можете использовать %1$s в отличие от just %s, но он все равно может получить messey с несколькими объявленными переменными).

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

может быть, я ошибаюсь, может быть, я упускаю что-то очевидное, но если кто-то может помочь мне понять, почему он существует (так что я знаю, должен ли я действительно использовать его!) Я бы appriciate его. Спасибо.

7 ответов


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) . "'";

Это просто вопрос предпочтений!


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);

речь идет о разделении статической строки и форматирования, а также данных.

это разделение предлагается в каждом языке программирования, который я знаю, потому что:

  • намерение программиста яснее и принудительно

    цель ясна: когда вы читаете это, вы знаете, какой тип ожидается для каждого поля:

       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, C++, Java, Python, Bash...) появиться похожие и способ лечения строк. Так что это хорошо для вас, чтобы знать это, и для тех, кто уже знает, это проще. И, как следствие, есть много документов и учебных пособий повсюду на тема и страница Википедии для нее:строка формата печати

  • строки могут быть отделены от ваших данных автоматически

    и это означает, что он доступен для перевода или синтаксис поправка.

вы найдете аналогичные проблемы с:

  • подготовленные операторы в mysql, которые теперь применяются с mysql_query будучи устарел в php 5.5 в пользу подготовленных заявлений.
  • весь язык шаблонов: где у вас есть шаблон обычно на другом языке, и данные с другой стороны, чтобы отобразить шаблон.
  • более общая тема рассматривается в Википедии:строка интерполяция

последняя точность:

echo не делает ничего больше, чем опережая строку. И printf делает интерполяцию строк, и выводит строку.

поэтому, чтобы быть справедливым, мы здесь сравниваем строку здания через конкатенация строк vs строку интерполяции. Поскольку нет ничего плохого в выводе строки с echo. Так что это не о echo но как вы сделаете свой строка. Ты делаешь строку интерполяции даже при использовании echo такой:

echo sprintf("avg: %.3f", $avg);

а потом, ну нет больше разницы между этой последней формой и:

printf("avg: %.3f", $avg);

printf вероятно, существует, потому что PHP был создан в C, и printf традиционно используется для вывода форматированных строк в с. printf на самом деле может сделать намного больше, чем echo потому что он может выводить переменные в различных форматах, включая десятичные дроби в определенные места и, вероятно, намного больше.

это, как говорится, вы можете сделать все, что printf может делать с некоторой комбинацией функций PHP, и это может иметь больше смысла в зависимости от вашего фона.


Я просто объясню, что я сделал, чтобы вы получили четкое различие, я не PHP Pro, поэтому, возможно, я ошибаюсь, и есть лучший или более простой подход, а также мой пример может быть не так полезен для вас.

Я передаю каждую строку, которую хочу перевести в функцию, и она возвращает переведенную строку, основанную на исходной строке и текущем языке, таким образом, она будет переводить:

" У кошки есть % D котята."(английский) " Katua %d kume ditu." (эускера)

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


Это наследие от C, унаследованное языком PHP

функция http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/


printf принимает входные данные по-разному: вы можете предоставить строку формата, а затем перечислить все необходимые входные данные (так же, как в C/C++).

'echo' и 'print' принимают только строки и проще в использовании.

ваше желание, ваш стиль :)

НЕ ТАК:

как говорили другие, echo-это языковая конструкция, а printf-реальная функция, Вы можете сделать много с printf.

люди, приезжающие из C/C++ и знаю много формат строки типа %f, %d,%.2F и что нет !!!!! Они предпочли бы, чтобы printf Эхо для этого сценария, как эти с плавающей запятой формат precison и другие будут на кончиках пальцев. Они WD предпочитают их над встроенными функциями формата PHP.