Я пытаюсь узнать больше о функции 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;
Я что-то пропустил?
ом
имеет все возможности форматирования оригинала printf, которая означает, что вы можете сделать гораздо больше, чем просто вводить значения переменных в строках.
Например, указать формат числа (шестнадцатеричный, десятичный, восьмеричный), число десятичных знаков, обивка и многое другое. Google для printf и вы'll найти много примеров. В статье Википедии О Е должно вам начать работу.
Есть много случаев использования функции sprintf, но один из способов, который я использую их на хранение строку вроде этой: 'привет, Меня зовут %ы' в базе данных или в качестве константы в PHP-класс. Таким образом, когда я хочу использовать эту строку я могу просто сделать это:
$name = 'Josh';
// $stringFromDB = 'Hello, My Name is %s';
$greeting = sprintf($stringFromDB, $name);
// $greetting = 'Hello, My Name is Josh'
По сути, это позволяет некоторое разделение в коде. Если я 'привет, Меня зовут %ы' во многих местах в моем коде я могу изменить его '%s-это мое имя' в одном месте и синхронизируются автоматически, без необходимости заходить на каждый экземпляр и передвигаться конкатенации.
Другое использование функции 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);
(Да, мой французский хромает: я учил в школе немецкий!)
В реальности, вы'd с помощью с текстом для хранения локализованных строк, но вы получаете идею.
Это'ы легче переводить.
echo _('Here is the result: ') . $result . _(' for this date ') . $date;
Перевод (с текстом) строки:
При переводе на другой язык может оказаться невозможным или его результаты очень странные предложения.
Теперь если у вас есть
echo sprintf(_("Here is the result: %s for this date %s"), $result, $date);
Перевод (с текстом) строки сейчас:
Что делает намного больше смысла, и он'ы гораздо более гибким, чтобы перевести на другие языки
Лучшая причина, что я нашел заключается в том, что он позволяет разместить все языковые строки в файле были люди смогут переводить и заказывать их по мере необходимости - но ты все равно знаешь, что не важно, какой формат строки В - вы хотите, чтобы показать имя.
Например, ваш сайт будет сказать: "Добро пожаловать [[пользователь]]" в верхней части страницы. Как программист вы Don'т знаю и уход как ребята интерфейса собираетесь писать что - вы просто знаете, что имя пользователя будет показано где-то в сообщении.
Так что вы можете вставить сообщение в коде без worring о том, какие на самом деле.
Файл Lang (язык):
...
$lang['welcome_message'] = 'Welcome back %s';
...
Тогда вы можете поддержать любой тип сообщения на любом языке с помощью этого в вашем PHP-коде.
sprintf($lang['welcome_message'], $user->name())
зачем вы хотите его использовать?
Он оказывается очень полезным при использовании (внешние) источник для языковых строк. Если вам нужно фиксированное количество переменных в заданном многоязычный строку, необходимо только знать правильный заказ:
en.txt
not_found = "%s could not be found."
bad_argument = "Bad arguments for function %s."
bad_arg_no = "Bad argument %d for function %s."
hu.txt
not_found = "A keresett eljárás (%s) nem található."
bad_argument = "Érvénytelen paraméterek a(z) %s eljárás hívásakor."
bad_arg_no = "Érvénytelen %d. paraméter a(z) %s eljárás hívásakor."
Введенные переменные Дон't даже должны быть в начале или конце на разных языках, только их заказ.
Конечно, вы могли бы написать свою собственную функцию для выполнения этой замены, несомненно, даже с некоторыми незначительными увеличивает производительность, но это намного быстрее, чтобы просто (при наличии класса "язык", чтобы читать язык):
/**
* throws exception with message($name = "ExampleMethod"):
* - using en.txt: ExampleMethod could not be found.
* - using hu.txt: A keresett eljárás (ExampleMethod) nem található.
*/
throw new Exception(sprintf(Language::Get('not_found'), $name));
/**
* throws exception with message ($param_index = 3, $name = "ExampleMethod"):
* - using en.txt: Bad argument 3 for function ExampleMethod.
* - using hu.txt: Érvénytelen 3. paraméter a(z) ExampleMethod eljárás hívásakor.
*/
throw new Exception(sprintf(Language::Get('bad_arg_no'), $param_index, $name));
Он также поставляется с полными возможностями е
, таким образом, также один-вкладыш для форматирования различных типов переменных, например:
Как уже упоминалось, это позволяет форматирование входных данных. Например, заставляя 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. Если вы разбираете ввода unsanitised, ваш сайт и сервер хакнут. (За исключением, конечно, переменные, которые были полностью построены на ваш код и гарантированно безопасны.)
Используя функции sprintf() гораздо чище и безопаснее для форматирования строки.
Например, когда вы'ре дело с входными переменными, это предотвращает неожиданные сюрпризы, указав ожидаемый формат заранее (например, что вы'вновь ждет строки [%С
] или количество [%Д
]). Это может потенциально помочь с возможным риском SQL-инъекций, но он выиграл'т допустить, если строки состоят цитаты.
Он также помогает бороться с поплавками, можно явно указать цифру точности (например,%.2Ф
), что избавляет вас от использования функций преобразования.
Другими преимуществами является то, что большинство основных языков программирования имеют свои собственные реализации функции sprintf (), поэтому, как только вы освоитесь с ним, он's еще проще, чем изучение нового языка (как для конкатенации строк или преобразования плавает).
В резюме, это'хорошая практика, чтобы использовать для того, чтобы иметь более чистый и читаемый код.
Например, см. ниже реальный пример:
$insert .= "('".$tr[0]."','".$tr[0]."','".$tr[0]."','".$tr[0]."'),";
Или простой пример, который печатает например'1','2','3','4'
:
print "foo: '" . $a . "','" . $b . "'; bar: '" . $c . "','" . $d . "'" . "\n";
и печать с отформатированную строку:
printf("foo: '%d','%d'; bar: '%d','%d'\n", $a, $b, $c, $d);
где функции printf()
эквивалентно `функции sprintf (), но он выводит отформатированную строку, а не возвращает ее (переменной).
Что легче читается?
Это:
"<p>Some big paragraph ".$a["name"]." again have to take care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragraph.";
Также может быть написано:
"<p>Some big paragraph {$a['name']} again have to take care of space and stuff .{$a['age']} also would be hard to keep track of punctuations and stuff in a really {$a['token']} paragraph.";
На мой взгляд это яснее, чтобы читать, но я вижу использование для локализации или форматирования.
Даже я, хотя то же самое, если я им недавно пользовались. Когда вы создаете документы на основе данных пользователей это будет удобно.
"<p>Some big paragraph ".$a["name"]." again have tot ake care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragarapoh.";
Который можно легко записать как
sprintf("Some big paragraph %s. Again have to take care of space and stuff.%s also wouldnt be hard to keep track of punctuations and stuff in a really %s paragraph",$a,$b,$c);
Ну, ом
имеет много возможностей, как мы знаем
пример как ниже:
Несколько месяцев назад я был в необходимость преобразования секунд в часы:минуты:секунды
Как $Т = 494050 //секунд-я хотел распечатать как
137 ч. 14 м. 10 Свот, я пришел с PHP функция
springf()я просто держать секунд в
$Tи
Эхо функции sprintf(" на%02d порта х %х%02d порта м %ы%02d порта с помощью", пол($Т/3600), $Ф ($Т/60)%60, $Ф $Т%60);дает мне
137 ч 14 м 10 с
функции sprintf() функция является очень полезной, если мы знаем, как использовать его.
Если вы'вэ использовании C/C++, то вы бы использоваться для функция sprintf.
Есть хороший шанс, что вторая линия становится менее эффективным. Эха предназначена в качестве выходных данных команды, в то время как функции sprintf предназначено, чтобы сделать строку маркера замещения. Я'м не PHP, но я подозреваю, что есть более объектов, связанных с Эхо. Если он действует как Java бы, он создает новую строку каждый раз что-то добавляется в список, так что вы'd в конечном итоге с 4 строки, созданные.
Я обычно используйте sprintf, чтобы гарантировать, что ID, который приходит от пользовательского ввода-это целое число, например:
// 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");
Это'ы очень полезно форматировать числа в различных представлениях (восьмеричной, десятичной точки контроля и т. д.).
Некоторые из типичных случаев, когда вам нужен более точный контроль над форматом вывода. Это может быть сложно, например, убедитесь, что определенное значение имеет определенный объем пространства на подкладке спереди, в зависимости от ее длины, или, что число выводится в определенный формат.
Есть много примеров в руководство по PHP
Также, Что касается вашего примера "по-проще написать, что".. хотя эхо может быть проще написать, ом легче читать, особенно если у вас много переменных.
Еще одна причина, чтобы использовать функции sprintf или printf может быть, что вы хотите позволить пользователю определять формат вывода некоторого значения - можно спокойно позволяют им определить функции sprintf формат, совместимый выход.
Да, и ваш пример на самом деле неправильно с одной стороны. ом
возвращает строку, но " эхо "не -" Эхо " сразу выводит его и ничего не возвращает, в то время как ом
просто возвращает его.
ОМ особенно полезно при форматировании строки, в которых используются числа. Например,
$oranges = -2.34;
echo sprintf("There are %d oranges in the basket", $oranges);
Output: There are -2 oranges in the basket
Апельсины форматируется как целое число (-2), но будет обтекать с положительными числами, если использовать %U для значений без знака. Чтобы избежать такого поведения, я использую абсолютную функцию, функцию ABS(), чтобы округлить число к нулю следующим образом:
$oranges = -5.67;
echo sprintf("There are %d oranges in the basket", abs($oranges));
Output: There are 5 oranges in the basket
Конечным результатом является выписка с высокой читабельности, логическое построение, четкое форматирование и гибкость для добавления дополнительных переменных по мере необходимости. По мере увеличения количества переменных в сочетании с функциями, которые манипулируют этими переменными, преимущества становятся все более очевидными. В качестве последнего примера:
$oranges = -3.14;
$apples = 1.5;
echo sprintf("There are %d oranges and %d apples", abs($oranges), abs($apples));
Output: There are 3 oranges and 4 apples
В левой части оператора функции sprintf четко выражает строки и типы ожидаемых значений, в то время как правая сторона четко выразила используемые переменные и как ими манипулируют.
Аргумент один и тот же для С помощью шаблонов. Вы'll хочу отделить Textsleev от фактических значений переменных. Кроме того, дополнительные полномочия функции sprintf, что мы'вновь упомянул об этом's просто вещь в стиле.
Очень хороший вариант использования функции sprintf выводит на подкладке форматы чисел, а также, при смешивании различных типов в строку. Это может быть легче читать во многих случаях и делает его супер просто, чтобы печатать разные представления одной и той же переменной, особенно цифровые,.
С помощью функции sprintf() функция над обычной конкатенации имеет то преимущество, что вы можете применять различные типы форматирования на переменные объединяются.
В вашем случае, у вас есть
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
и
$output = 'Here is the result: ' .$result. ' for this date ' .$date;
Давайте возьмем $результат = 'сдал'; дата = 'и 23';
Используя обычную конкатенацию вы можете только сделать вывод:
Here is the result: passed for this date 23rd
Однако если вы используете `функции sprintf () можно получить изменение вывода, такие как:
$output = sprintf('Here is the result: %.4s for this date %.2s',$result,$date);
echo $output;
Выход:
Here is the result: pass for this date 23