Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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)

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

Ответ 7

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

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

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

НЕ ЭТО:

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

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