Я пытаюсь узнать больше о функции PHP sprintf (), но php.net не сильно мне помог, так как я все еще растерялся, зачем вам его использовать?
Посмотрите на мой пример ниже.
Зачем использовать это:
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
Когда это делает то же самое и легче написать ИМО:
$output = 'Here is the result: ' .$result. ' for this date ' .$date;
Я что-то здесь упускаю?
$output
, а второй -echo
его.Ответы:
sprintf
имеет все возможности форматирования исходного printf, что означает, что вы можете сделать гораздо больше, чем просто вставлять значения переменных в строки.Например, укажите формат числа (шестнадцатеричный, десятичный, восьмеричный), количество десятичных знаков, отступы и многое другое. Google для printf, и вы найдете множество примеров. Википедии статья на Printf должно вам начать работу.
источник
sprintf('%03d', $num)
%,8d
например, чтобы получить правильно выровненное 8-значное целое число, разделенное запятыми. Использованиеnumber_format
менее удобно вprintf
стиле.sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');
результатеHello World, my name is also World.
Существует множество вариантов использования sprintf, но я использую их одним способом, сохраняя строку типа «Hello, My Name is% s» в базе данных или в качестве константы в классе PHP. Таким образом, когда я хочу использовать эту строку, я могу просто сделать это:
По сути, это допускает некоторое разделение в коде. Если я использую «Здравствуйте, мое имя% s» во многих местах моего кода, я могу изменить его на «% s - мое имя» в одном месте, и оно обновляется везде в другом месте автоматически, без необходимости переходить к каждому экземпляру и перемещаться конкатенации.
источник
Другое использование
sprintf
в локализованных приложениях в качестве аргументов, которыеsprintf
не обязательно должны быть в том порядке, в котором они появляются в строке формата.Пример:
Но язык как французский заказывает слова по-другому:
(Да, мой французский отстой: я выучил немецкий в школе!)
В действительности вы бы использовали gettext для хранения локализованных строк, но вы поняли идею.
источник
Проще перевести.
Строки перевода (gettext) теперь:
При переводе на другой язык это может оказаться невозможным или привести к очень странным предложениям.
Теперь, если у вас есть
Перевод (gettext) строки теперь:
Что имеет гораздо больше смысла, и это гораздо более гибко переводить на другие языки
источник
echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);
Это позволило бы переводу изменить фразу, напримерFor the date %2$s, the result is %1$s
Лучшая причина, которую я нашел, заключается в том, что она позволяет вам поместить все языковые строки в ваш языковой файл, где люди могут переводить и упорядочивать их по мере необходимости, - но вы все равно знаете, что независимо от того, в каком формате находится строка - вы хотите показать имя пользователя.
Например, ваш сайт скажет «Добро пожаловать [[Пользователь]]» в верхней части страницы. Как программист, вы не знаете или не заботитесь о том, как парни из UI собираются это писать - вы просто знаете, что имя пользователя будет показано где-то в сообщении.
Таким образом, вы можете встроить сообщение в свой код, не беспокоясь о том, что это сообщение на самом деле.
Файл Lang (EN_US):
Затем вы можете поддерживать сообщения любого типа на любом языке, используя это в своем фактическом PHP-коде.
источник
Это оказывается очень полезным при использовании (внешнего) источника для языковых строк. Если вам нужно фиксированное количество переменных в заданной многоязычной строке, вам нужно знать только правильный порядок:
EN.txt
hu.txt
Вставленные переменные не обязательно должны быть в начале или в конце на нескольких языках, важен только их порядок.
Конечно, вы могли бы написать свою собственную функцию для выполнения этой замены, несомненно, даже с небольшим повышением производительности, но это гораздо быстрее (если у вас есть класс
Language
для чтения языковых строк) :Он также поставляется с полным набором возможностей и
printf
, таким образом, является однострочным для форматирования различных типов переменных, например:источник
Как уже упоминалось, это позволяет форматировать входные данные. Например, форсирование 2dp, 4-значных чисел и т. Д. Это очень полезно для построения строк запросов MySQL.
Еще одним преимуществом является то, что он позволяет вам отделить расположение строки от данных, вводимых в нее, почти как в параметрах. Например, в случае запроса MySQL:
Этот метод, конечно, имеет другое применение, например, при печати вывода в формате HTML и т. Д.
Редактировать: Из соображений безопасности при использовании описанного выше метода вы должны очистить все входные переменные
mysql_real_escape_string()
перед использованием этого метода , чтобы предотвратить атаки вставки MySQL. Если вы проанализируете несанкционированный ввод, ваш сайт и сервер будут взломаны . (За исключением, конечно, переменных, которые были полностью созданы вашим кодом и гарантированно безопасны.)источник
Использование sprintf () намного чище и безопаснее для форматирования вашей строки.
Например, когда вы имеете дело с входными переменными, он предотвращает неожиданные неожиданности, заранее указав ожидаемый формат (например, ожидаемую строку [
%s
] или число [%d
]). Это может потенциально помочь с возможным риском внедрения SQL , но не предотвратит кавычки, состоящие из строк.Это также помогает работать с числами с плавающей запятой, вы можете явно указать точность цифр (например
%.2f
), которая избавляет вас от использования функций преобразования.Другое преимущество состоит в том, что большинство основных языков программирования имеют свою собственную реализацию
sprintf()
, поэтому, когда вы познакомитесь с ним, его будет еще проще использовать, чем изучать новый язык (например, как объединять строки или преобразовывать числа с плавающей запятой).Таким образом, это хорошая практика, чтобы иметь более чистый и читаемый код.
Например, посмотрите реальный пример ниже :
Или простой пример, который печатает, например
'1','2','3','4'
:и печать с форматированной строкой:
где
printf()
эквивалентноsprintf()
, но выводит отформатированную строку вместо ее возврата (в переменную).Что является более читабельным?
источник
sprintf()
разбитый на несколько строк, где строка с заполнителями находится на 1 строке, а значения находятся на строке или даже на нескольких строках под ней, все с правильными отступами курс. Используя ваше демо так, как я описал ... i.imgur.com/DFi3ur8.pngДаже я, хотя то же самое, если я не использовал это недавно. Когда вы генерируете документы на основе пользовательского ввода, это будет удобно.
Что можно легко записать как
источник
"<p>Some big paragraph {$a['name']} more words {$a['age']}</p>"
. ОДНАКО, НЕ ЗАБУДЬТЕ дезинфицировать ввод пользователя, или вы открываете свой код до уязвимостей XSS.Это:
Также может быть написано:
На мой взгляд, это более понятно для чтения, но я вижу использование для локализации или форматирования.
источник
В некоторых типичных случаях требуется более точный контроль над форматом вывода. Может быть сложно, например, убедиться, что конкретное значение имеет определенное количество пробелов, добавленных вперед, в зависимости от его длины, или что число выводится в определенном точном формате.
Есть много примеров в руководстве по PHP
Также то, что приходит к вашему примеру «проще писать». Хотя эхо может быть легче писать, sprintf легче читать, особенно если у вас много переменных.
Другая причина использования sprintf или printf может заключаться в том, что вы хотите позволить пользователю определять выходной формат некоторого значения - вы можете спокойно позволить ему определять совместимый с sprintf выходной формат.
Ох, и ваш пример на самом деле не так с одной стороны.
sprintf
возвращает строку, аecho
не -echo
сразу выводит ее и ничего не возвращает, аsprintf
просто возвращает.источник
Если вы использовали C / C ++, то вы бы привыкли к функции sprintf.
Есть большая вероятность, что вторая линия менее эффективна. Echo разработан как выходная команда, тогда как sprintf предназначен для подстановки строковых токенов. Я не PHP человек, но я подозреваю, что с эхом связано больше объектов. Если он работает как Java, он создает новую строку каждый раз, когда что-то добавляется в список, так что вы получите 4 созданные строки.
источник
Иногда я получаю что-то вроде этого, которое я считаю немного более простым для чтения:
источник
Я обычно использую sprintf, чтобы гарантировать, что идентификатор, полученный из пользовательского ввода, является целым числом, например:
Также используется для создания элементарных шаблонов (для html-писем или других вещей), так что вы можете использовать шаблон во многих местах:
Также очень полезно форматировать числа в разных представлениях (восьмеричное, управлять десятичным знаком и т. Д.).
источник
источник
sprintf особенно полезен при форматировании строк, использующих числа. Например,
Апельсины отформатированы как целое число (-2), но будут округлены до положительных чисел, если использовать% u для значений без знака. Чтобы избежать такого поведения, я использую абсолютную функцию abs (), чтобы округлить число до нуля следующим образом:
Конечным результатом является оператор с высокой читабельностью, логической конструкцией, четким форматированием и гибкостью для добавления дополнительных переменных по мере необходимости. Поскольку число переменных увеличивается в сочетании с функциями, которые управляют этими переменными, преимущества становятся более очевидными. В качестве последнего примера:
Левая часть оператора sprintf четко отображает строку и типы ожидаемых значений, в то время как правая часть четко отображает используемые переменные и то, как они манипулируют.
источник
sprintf
в PHP, но затем я увидел, что эти замысловатые примеры создают плоды из «пропавших без вести» фрукты :), каждый из которых только показывает%d
(иabs()
, что не имеет отношения к теме), вместо того, чтобы показывать некоторые из множества вариантов форматирования чисел (которые были бы актуальны), я передумал. Но если вы обновите ответ, у меня все еще будет мой голос в холодильнике для вас. :) Спасибо, ура!Ну,
sprintf
есть много возможностей, как мы знаем пример ниже:Несколько месяцев назад мне нужно было преобразовать секунды в часы: минуты: секунды. Как будто
$t = 494050 //seconds
я хотел напечатать137 h 14 m 10 s
так, я придумал функцию php,springf()
я просто держу секунды$t
иecho sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
дает мне137 h 14 m 10 s
Функция sprintf () очень полезна, если мы знаем, как ее использовать.
источник
Аргумент тот же для использования шаблонов. Вы хотите отделить ваш Textsleev от фактических значений переменных. Помимо дополнительных возможностей sprintf, о которых мы упоминали, это просто стиль.
источник
Действительно хорошим вариантом использования sprintf является вывод числовых форматов с добавками, а также при смешивании различных типов в строке. Во многих случаях это может быть проще для чтения и делает его очень простым для печати различных представлений одной и той же переменной, особенно числовых.
источник
Использование функции sprintf () по сравнению с обычной конкатенацией имеет то преимущество, что вы можете применять различные типы форматирования к переменным, которые должны быть объединены.
В вашем случае у вас есть
и
Давайте возьмем
$result = 'passed'; date = '23rd';
Используя обычную конкатенацию, вы можете получить только результат:
Однако, если вы используете,
sprintf()
вы можете получить модифицированный вывод, такой как:Вывод:
источник
sprintf()
очень похоже наprintf()
. Если вы знаетеprintf()
в деталях, тоsprintf()
и дажеvsprintf()
и не очень трудно понять.одна из вещей , которые отличается
sprintf()
отprintf()
, что вам нужно объявить переменную , чтобы поймать выход из функции , поскольку она не напрямую печатать / эхо ничего. Давайте посмотрим следующие фрагменты кода:Надеюсь, это поможет.
источник
Один «выводит», другой «возвращает», это одно из главных отличий.
printf()
Выходыsprintf()
Возвращаетисточник
Вы должны быть осторожны при использовании sprintf в циклах:
Что приводит к следующему времени (на моей локальной машине с PHP 7.2):
Петли: 10000000
$ a. $ б. $ c. $ d. $ е. $ f 'нужно 1.4507689476013s
«$ a $ b $ c $ d $ e $ f» требует 1.9958319664001s
sprintf ('% s% s% s% s% s% s', $ a, $ b, $ c, $ d, $ e, $ f) необходимо 9.1771278381348s
источник
Я использую это для сообщений пользователям или других "симпатичных" типов функциональности. Например, если я знаю, я собираюсь использовать имя пользователя.
И иметь несколько сообщений для использования в этой ситуации. (Т.е. блокирование или отслеживание другого пользователя)
Вы можете создать общую функцию, которая делает что-то для пользователя, и добавить эту строку, и независимо от того, какова структура предложения, она должна выглядеть довольно красиво. Мне всегда не нравится просто добавлять строки вместе и постоянно использовать точечную запись, а также закрывать и открывать строки, чтобы предложение выглядело хорошо. Сначала я был фанатом, как и большинство, но это кажется довольно полезным, когда нужно манипулировать несколькими строками, и вы не хотите жестко кодировать размещение переменной каждый раз.
Подумайте об этом, что выглядит лучше?
Или
Конечно, это дополнительный шаг, но что, если ваши условные проверки выполняют кучу других функциональных вещей, тогда цитаты и добавления начинают мешать кодированию функционально.
источник