str - ¿Por qué usar la función sprintf en PHP?
sprintf php mysql (20)
¿Por qué querrías usarlo?
Resulta muy útil cuando se utiliza una fuente (externa) para cadenas de idioma. Si necesita un número fijo de variables en una cadena multilingüe determinada, solo necesita saber el orden correcto:
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."
Las variables insertadas ni siquiera tienen que estar al principio o al final en varios idiomas, solo importa su orden.
Por supuesto, puede escribir su propia función para realizar esta sustitución, sin duda, incluso con algunos aumentos de rendimiento menores, pero es mucho más rápido que simplemente (dado que tiene un Language
clase para leer cadenas de idioma) :
/**
* 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));
También viene con todas las capacidades de printf
, por lo tanto, también es un trazador de líneas para formatear numerosos tipos de variables, por ejemplo:
- precision salida de número de punto flotante, o
- llenando enteros con ceros a la izquierda .
Estoy tratando de aprender más sobre la función de PHP sprintf () pero php.net no me ayudó mucho ya que todavía estoy confundido, ¿por qué querrías usarlo?
Echa un vistazo a mi ejemplo a continuación.
Por qué usar esto:
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
Cuando esto hace lo mismo y es más fácil escribir IMO:
$output = ''Here is the result: '' .$result. '' for this date '' .$date;
¿Me estoy perdiendo de algo?
Si usaste C / C ++, entonces estarías acostumbrado a la función sprintf.
Existe una buena posibilidad de que la segunda línea sea menos eficiente. Echo está diseñado como un comando de salida, mientras que sprintf está diseñado para hacer una sustitución de token de cadena. No soy una persona de PHP, pero sospecho que hay más objetos involucrados con el eco. Si actúa como lo haría Java, crea una nueva cadena cada vez que se agrega algo a la lista, por lo que terminarías creando 4 cadenas.
A veces tengo algo como esto, que considero un poco más fácil de leer:
$fileName = sprintf(''thumb_%s.%s'',
$fileId,
$fileInfo[''extension'']);
Algunos de los casos típicos son donde necesita un control más preciso sobre el formato de salida. Puede ser difícil, por ejemplo, asegurarse de que un valor específico tenga una cantidad específica de espacios acolchados al frente, según su longitud, o que un número se emita en un formato preciso específico.
Hay muchos ejemplos en el manual de PHP
También lo que viene a su ejemplo de "más fácil de escribir" .. Mientras que el eco puede ser más fácil de escribir, el sprintf es más fácil de leer, especialmente si tiene muchas variables.
Otra razón para usar sprintf o printf podría ser que desee permitir que un usuario defina el formato de salida de algún valor; puede permitir que definan de forma segura un formato de salida compatible con sprintf.
Ah, y tu ejemplo es realmente incorrecto para una parte. sprintf
devuelve la cadena, pero echo
no - echo
inmediatamente la emite y no devuelve nada, mientras que sprintf
simplemente la devuelve.
Bueno, sprintf
tiene muchas capacidades ya que conocemos un ejemplo de la siguiente manera:
Hace algunos meses necesitaba convertir segundos a horas: minuto: formato de segundos Como $t = 494050 //seconds
quería imprimir como 137 h 14 m 10 s
así que se me ocurrió la función php springf()
simplemente springf()
los segundos en $t
y echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
me da 137 h 14 m 10 s
La función sprintf () es muy útil si sabemos cómo usarla.
Como se mencionó, permite el formateo de los datos de entrada. Por ejemplo, forzando números de 2dp, 4 dígitos, etc. Es bastante útil para construir cadenas de consulta MySQL.
Otra ventaja es que le permite separar el diseño de la cadena de los datos que se introducen en ella, casi como alimentar en parámetros. Por ejemplo, en el caso de una consulta 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);
Este método, por supuesto, tiene otros usos, como imprimir resultados como HTML, etc.
Editar: Por razones de seguridad , cuando se utiliza una técnica como la anterior , debe desinfectar todas las variables de entrada con mysql_real_escape_string()
antes de usar este método , para evitar ataques de inserción de MySQL. Si analiza una entrada no analizada, su sitio y servidor serán pirateados . (Con excepción de, por supuesto, las variables que han sido completamente construidas por su código y que se garantiza que son seguras).
El argumento es el mismo para usar plantillas. Querrá separar su Textsleev de los valores de las variables reales. Además de los poderes adicionales de sprintf que mencionamos, es solo una cuestión de estilo.
El uso de la función sprintf () sobre la concatenación ordinaria tiene la ventaja de que puede aplicar diferentes tipos de formateo en las variables que se concatenarán.
En tu caso, tienes
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
y
$output = ''Here is the result: '' .$result. '' for this date '' .$date;
Tomemos $result = ''passed''; date = ''23rd'';
$result = ''passed''; date = ''23rd'';
Con la concatenación ordinaria solo puede obtener el resultado:
Here is the result: passed for this date 23rd
Sin embargo, si usa sprintf()
puede obtener un resultado modificado como:
$output = sprintf(''Here is the result: %.4s for this date %.2s'',$result,$date);
echo $output;
Salida:
Here is the result: pass for this date 23
Es más fácil de traducir.
echo _(''Here is the result: '') . $result . _('' for this date '') . $date;
Las cadenas de traducción (gettext) ahora son:
- Aquí está el resultado:
- para esta fecha
Cuando se traduce a algún otro idioma, puede ser imposible o resulta en oraciones muy extrañas.
Ahora si tienes
echo sprintf(_("Here is the result: %s for this date %s"), $result, $date);
Las cadenas de traducción (gettext) ahora son:
- Aquí está el resultado:% s para esta fecha% s
Lo cual tiene mucho más sentido y es mucho más flexible para traducir a otros idiomas
Esta:
"<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.";
También podría escribirse:
"<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.";
En mi opinión, esto es más claro de leer, pero puedo ver el uso para localizar o formatear.
Hay muchos casos de uso para sprintf, pero una forma en que los uso es almacenando una cadena como esta: ''Hola, Mi nombre es% s'' en una base de datos o como una constante en una clase de PHP. De esa manera, cuando quiero usar esa cadena, simplemente puedo hacer esto:
$name = ''Josh'';
// $stringFromDB = ''Hello, My Name is %s'';
$greeting = sprintf($stringFromDB, $name);
// $greetting = ''Hello, My Name is Josh''
Básicamente, permite cierta separación en el código. Si uso ''Hola, mi nombre es% s'' en muchos lugares de mi código, puedo cambiarlo a ''% s es mi nombre'' en un solo lugar y se actualiza automágicamente en cualquier otro lugar, sin tener que ir a cada instancia y moverse concatenaciones.
Incluso pensé lo mismo a menos que lo haya usado recientemente. Cuando genere documentos basados en las entradas del usuario, esto será útil.
"<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.";
Que se puede escribir fácilmente como
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);
La mejor razón que he encontrado es que le permite colocar todas las cadenas de idioma en su archivo de idioma si la gente puede traducirlas y pedirlas según sea necesario; sin embargo, todavía sabe que no importa en qué formato esté la cadena, desea mostrar el nombre de los usuarios.
Por ejemplo, su sitio dirá "Bienvenido nuevamente [[Usuario]]" en la parte superior de la página. Como el programador no conoce o no le importa cómo van a escribir los usuarios de la interfaz de usuario, simplemente sabe que el nombre de un usuario se mostrará en algún lugar de un mensaje.
Entonces puede insertar el mensaje en su código sin preocuparse por lo que ese mensaje realmente es.
Archivo de Lang (EN_US):
...
$lang[''welcome_message''] = ''Welcome back %s'';
...
Entonces puede admitir cualquier tipo de mensaje en cualquier idioma usando esto en su código php real.
sprintf($lang[''welcome_message''], $user->name())
Normalmente utilizo sprintf para garantizar que un ID que proviene de la entrada del usuario es un entero, por ejemplo:
// is better use prepared statements, but this is practical sometimes
$query = sprintf("SELECT * from articles where id = %d;",$_GET[''article_id'']);
También se usa para hacer plantillas rudimentarias (para correos electrónicos html u otras cosas), por lo que puede volver a utilizar la plantilla en muchos lugares:
$mail_body = "Hello %s, ...";
$oneMail = sprintf($mail_body, "Victor");
$anotherMail = sprintf($mail_body, "Juan");
También es muy útil para formatear números en diferentes representaciones (octal, controlar el lugar decimal, etc.).
Otro uso de sprintf
es en aplicaciones localizadas ya que los argumentos para sprintf
no tienen que ser en el orden en que aparecen en la cadena de formato.
Ejemplo:
$color = ''blue'';
$item = ''pen'';
sprintf(''I have a %s %s'', $color, $item);
Pero un idioma como el francés ordena las palabras de manera diferente:
$color = ''bleu'';
$item = ''stylo'';
sprintf(''J/'ai un %2$s %1$s'', $color, $item);
(Sí, mi francés apesta: ¡aprendí alemán en la escuela!)
En realidad, usaría gettext para almacenar cadenas localizadas, pero se entiende la idea.
Un buen caso de uso para usar sprintf es la salida de formatos acolchados de números y también, cuando se mezclan diferentes tipos en una cadena. Puede ser más fácil de leer en muchos casos y hace que sea super sencillo imprimir diferentes representaciones de la misma variable, especialmente las numéricas.
Usar sprintf() es mucho más limpio y seguro para formatear tu cadena.
Por ejemplo, cuando se trata de variables de entrada, evita sorpresas inesperadas al especificar el formato esperado de antemano (por ejemplo, que está esperando cadena [ %s
] o el número [ %d
]). Esto podría ayudar con el posible riesgo de inyección de SQL , pero no evitará que las comillas de cadena sean cotizaciones.
También ayuda a tratar con flotantes, puede especificar explícitamente la precisión del dígito (por ejemplo, %.2f
) que le ahorra el uso de funciones de conversión.
La otra ventaja es que la mayoría de los principales lenguajes de programación tienen su propia implementación de sprintf()
, por lo que una vez que se familiarice con ella, es aún más fácil de usar, en lugar de aprender un nuevo idioma (por ejemplo, cómo concatenar cadenas o convertir el flota)
En resumen, es una buena práctica usarla para tener un código más limpio y legible.
Por ejemplo, vea el siguiente ejemplo real :
$insert .= "(''".$tr[0]."'',''".$tr[0]."'',''".$tr[0]."'',''".$tr[0]."''),";
O algún ejemplo simple que imprime, por ejemplo, ''1'',''2'',''3'',''4''
:
print "foo: ''" . $a . "'',''" . $b . "''; bar: ''" . $c . "'',''" . $d . "''" . "/n";
e impresión con cadena formateada:
printf("foo: ''%d'',''%d''; bar: ''%d'',''%d''/n", $a, $b, $c, $d);
donde printf()
es equivalente a sprintf()
, pero genera una cadena formateada en lugar de devolverla (a la variable).
¿Cuál es más legible?
sprintf es particularmente útil al formatear cadenas que usan números. Por ejemplo,
$oranges = -2.34;
echo sprintf("There are %d oranges in the basket", $oranges);
Output: There are -2 oranges in the basket
Naranjas tiene el formato de un número entero (-2), pero se ajustará a números positivos si uno usa% u para valores sin signo. Para evitar este comportamiento, utilizo la función absoluta, abs (), para redondear el número hacia cero de la siguiente manera:
$oranges = -5.67;
echo sprintf("There are %d oranges in the basket", abs($oranges));
Output: There are 5 oranges in the basket
El resultado final es una declaración con alta legibilidad, construcción lógica, formato claro y flexibilidad para agregar variables adicionales según sea necesario. A medida que el número de variables aumenta en combinación con funciones que manipulan estas variables, los beneficios se vuelven más evidentes. Como último ejemplo:
$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
El lado izquierdo de la declaración de sprintf expresa claramente la cadena y los tipos de valores esperados, mientras que el lado derecho expresa claramente las variables utilizadas y cómo se manipulan.
sprintf
tiene todas las capacidades de formateo del printf original, lo que significa que puede hacer mucho más que simplemente insertar valores de variable en cadenas.
Por ejemplo, especifique el formato del número (hexadecimal, decimal, octal), el número de decimales, el relleno y más. Google para printf y encontrarás muchos ejemplos. El artículo de wikipedia en printf debería ayudarte a comenzar.
define(''TEXT_MESSAGE'', ''The variable "%s" is in the middle!'');
sprintf(TEXT_MESSAGE, "Var1");
sprintf(TEXT_MESSAGE, "Var2");
sprintf(TEXT_MESSAGE, "Var3");