Почему использование sprintf функционирует в PHP?

Я установил действие по умолчанию в окнах для "Открытия WinZip". Это облегчает управлять БАНКАМИ как архивами. Можно даже добавить/удалить файлы вручную.

186
задан JasonDavis 11 September 2012 в 11:49
поделиться

11 ответов

sprintf имеет все возможности форматирования исходного printf, что означает, что вы можете делать гораздо больше, чем просто вставлять значения переменных в строки.

Например, укажите формат числа (шестнадцатеричный, десятичный, восьмеричный), количество десятичные дроби, отступы и многое другое. Google для printf, и вы найдете множество примеров. Статья в википедии о printf должна помочь вам начать работу.

127
ответ дан 23 November 2019 в 05:49
поделиться

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

// is better use prepared statements, but this is practical sometimes
$query = sprintf("SELECT * from articles where id = %d;",$_GET['article_id']);

Также используется для создания элементарных шаблонов (для HTML-писем или других вещей), поэтому вы можете повторно использовать шаблон во многих местах:

$mail_body = "Hello %s, ...";
$oneMail = sprintf($mail_body, "Victor");
$anotherMail = sprintf($mail_body, "Juan");

Также очень полезно форматировать числа в различные представления (восьмеричное, управление десятичным разрядом и т. д.).

3
ответ дан 23 November 2019 в 05:49
поделиться

Иногда я получал что-то вроде этого, что я считаю немного более легким для чтения:

$fileName = sprintf('thumb_%s.%s', 
                    $fileId,
                    $fileInfo['extension']);
3
ответ дан 23 November 2019 в 05:49
поделиться

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

Есть много примеров в руководство по PHP

Также, что касается вашего примера «проще писать» .. Хотя эхо может быть проще написать, sprintf легче читать, особенно если у вас много переменных.

Другая причина использование sprintf или printf может означать, что вы хотите позволить пользователю определять выходной формат некоторого значения - вы можете спокойно разрешить им определять выходной формат, совместимый со sprintf.

О, и ваш пример на самом деле неверен для одной части. sprintf возвращает строку,

3
ответ дан 23 November 2019 в 05:49
поделиться

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

Например, ваш сайт скажет «С возвращением [[Пользователь]]» вверху страницы. Как программист, вы не знаете или не заботитесь , как разработчики пользовательского интерфейса собираются это написать - вы просто знаете, что имя пользователя будет отображаться где-то в сообщении.

Таким образом, вы можете встроить сообщение в свой код, не беспокоясь о том, что это за сообщение на самом деле.

Lang file (EN_US):

...
$lang['welcome_message'] = 'Welcome back %s';
...

Затем вы можете поддерживать любой тип сообщения на любом языке, используя это в своем фактический PHP-код.

sprintf($lang['welcome_message'], $user->name())
16
ответ дан 23 November 2019 в 05:49
поделиться

Как уже упоминалось, он позволяет форматировать входные данные. Например, принудительное использование 2dp, 4-значных чисел и т. Д. Это весьма полезно для построения строк запроса MySQL.

Еще одно преимущество состоит в том, что он позволяет отделить макет строки от вводимых в нее данных, почти как подача в параметрах. Например, в случае запроса MySQL:

// For security, you MUST sanitise ALL user input first, eg:
$username = mysql_real_escape_string($_POST['username']); // etc.
// Now creating the query:
$query = sprintf("INSERT INTO `Users` SET `user`='%s',`password`='%s',`realname`='%s';", $username, $passwd_hash, $realname);

Этот метод, конечно, может использоваться и в других целях, например, при печати вывода в формате HTML и т. Д.

Изменить: По соображениям безопасности при использовании Как описано выше , вы должны дезинфицировать все входные переменные с помощью mysql_real_escape_string () перед использованием этого метода , чтобы предотвратить атаки вставки MySQL. Если вы проанализируете необработанный ввод, ваш сайт и сервер будут взломаны . (За исключением, конечно,

8
ответ дан 23 November 2019 в 05:49
поделиться

Это проще перевести.

echo _('Here is the result: ') . $result . _(' for this date ') . $date;

Строки перевода (gettext) теперь имеют вид:

  • Вот результат:
  • для этой даты

При переводе на другой язык это может оказаться невозможным или привести к очень странным предложениям.

Теперь, если у вас есть

echo sprintf(_("Here is the result: %s for this date %s"), $result, $date);

Строки перевода (gettext), это:

  • Вот результат:% s для этой даты% s

Что дает много больше смысла и гораздо удобнее переводить на другие языки

36
ответ дан 23 November 2019 в 05:49
поделиться

Есть много вариантов использования sprintf, но я использую их в качестве одной из следующих строк: «Здравствуйте, меня зовут% s» в базе данных или как константу в Класс PHP. Таким образом, когда я хочу использовать эту строку, я могу просто сделать это:

$name = 'Josh';
// $stringFromDB = 'Hello, My Name is %s';
$greeting = sprintf($stringFromDB, $name);
// $greetting = 'Hello, My Name is Josh'

По сути, это позволяет некоторое разделение в коде. Если я использую 'Hello, My Name is% s' во многих местах моего кода, я могу изменить его на '% s is my name' в одном месте, и он обновляется везде автоматически, без необходимости переходить к каждому экземпляру и перемещаться. конкатенации.

76
ответ дан 23 November 2019 в 05:49
поделиться

Другое использование sprintf - в локализованных приложениях, поскольку аргументы для sprintf не обязательно должны быть в том порядке, в котором они появляются в строке формата. .

Пример:

$color = 'blue';
$item = 'pen';

sprintf('I have a %s %s', $color, $item);

Но такой язык, как французский, упорядочивает слова по-другому:

$color = 'bleu';
$item = 'stylo';

sprintf('J\'ai un %2$s %1$s', $color, $item);

(Да, мой французский отстой: я учил немецкий в школе!)

На самом деле вы бы использовали gettext для хранения локализованных строк, но вы поняли идею.


46
ответ дан 23 November 2019 в 05:49
поделиться
  1. Если вы использовали C / C ++, то вы привыкли к функции sprintf .

  2. Есть большая вероятность, что вторая линия менее эффективна. Echo разработан как команда вывода, тогда как sprintf предназначен для подстановки строковых токенов. Я не специалист по PHP, но подозреваю, что с эхом связано больше объектов. Если он действует как Java, он создает новую строку каждый раз, когда что-то добавляется в список, так что в итоге вы получите 4 строки.

3
ответ дан 23 November 2019 в 05:49
поделиться
define('TEXT_MESSAGE', 'The variable "%s" is in the middle!');

sprintf(TEXT_MESSAGE, "Var1");
sprintf(TEXT_MESSAGE, "Var2");
sprintf(TEXT_MESSAGE, "Var3");
3
ответ дан 23 November 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: