Una de las cosas más comunes que hacemos como desarrolladores es concatenar cadenas. El operador para concatenar cadenas en PHP es el punto. Concatenamos dos cadenas así:
$saludo = "hola" . " mundo";
Pero la cosa se complica cuando quieres concatenar varias cosas de distintos tipos, o concatenar resultados de llamar a funciones. Es por ello que hoy explicaré una alternativa a concatenar en PHP, y me refiero a las funciones printf y sprintf.
Nota: para el generador de código de CodeIgniter utilicé mucho la función sprintf.
La teoría
Estas dos funciones que veremos sirven para muchísimas cosas, pero aquí únicamente te explicaré a usarlas y cómo te ayudarán a mejorar (en algunas ocasiones) tu código. Funcionan exactamente que en C.
Lo que hace printf y sprintf es formatear una cadena con “placeholders”. La diferencia entre printf
y sprintf
es que printf
imprime directamente el mensaje formateado, mientras que sprintf
regresa una cadena que incluye el mensaje formateado.
La práctica: cómo usar printf
Vamos a ver algunas comparaciones entre usar echo
concatenando cadenas o usar printf
.
Para mandar un mensaje con variables puedes escribir esto:
printf("Hola %s tu edad es %d", $nombre, $edad);
En lugar de esto:
echo "hola $nombre tu edad es $edad";
Vas a agradecerlo cuando llames a funciones. Veamos este otro ejemplo en donde se imprime el resultado de llamar a dos funciones:
<?php
// Funciones "ficticias" para demostrar
function obtenerNombre(){
return "parzibyte";
}
function obtenerEdad(){
return 21;
}
echo "Hola " . obtenerNombre() . " tu edad es " . obtenerEdad();
Claro que podrías almacenar el resultado de la llamada en variables separadas, pero el punto aquí era hacerlo de manera corta. Ahora veamos el equivalente con sprintf
:
<?php
// Funciones "ficticias" para demostrar
function obtenerNombre(){
return "parzibyte";
}
function obtenerEdad(){
return 21;
}
printf("Hola %s tu edad es %d", obtenerNombre(), obtenerEdad());
De hecho, desde que uno lee la cadena del formato sabe lo que se va a imprimir al final. Recuerda que estamos haciéndolo con ejemplos simples, aunque en la vida real a menudo vas a encontrar algunos realmente complejos.
Las comillas y echo
Otro problema que printf
resuelve es cuando queremos imprimir y encerrar algo entre comillas. Tal vez no sea muy común lo que veremos a continuación, aunque de igual manera vamos a ver este ejemplo en donde no podemos usar comillas simples pero tenemos que concatenar un mensaje:
<?php
// Funciones "ficticias" para demostrar
function obtenerNombre(){
return "parzibyte";
}
function obtenerEdad(){
return 21;
}
echo 'Hola "' . obtenerNombre() . '" tu edad es "' . obtenerEdad() . '"';
En este caso se muestran los datos encerrados entre comillas. En ocasiones se necesita eso, cosa que realmente se complica con más variables. Con printf
sería distinto:
<?php
// Funciones "ficticias" para demostrar
function obtenerNombre(){
return "parzibyte";
}
function obtenerEdad(){
return 21;
}
printf('Hola "%s" tu edad es "%d"', obtenerNombre(), obtenerEdad());
Así podría mostrar ejemplos, pero en resumen, printf es mejor que concatenar y usar echo en algunas ocasiones.
Un buen uso de printf
No creo que en la actualidad sea bueno usar PHP puro para mostrar HTML pero viene de maravilla cuando, por ejemplo, queremos renderizar un enlace que le envíe un correo a alguien. Normalmente sería así:
<?php
$correo = "contacto@parzibyte.me";
echo '<a href="mailto:' . $correo . '">Puedes contactarme en: ' . $correo . '</a>';
Con printf
queda más expresivo:
#<?php
$correo = "contacto@parzibyte.me";
printf('<a href="mailto:%1$s">Puedes contactarme en: %1$s</a>', $correo);
Además de que nos evita poner la variable dos veces. En ese ejemplo usamos la numeración de argumentos en %1$s
que se separa en:
%
: signo de porcentaje, siempre va al inicio1$
: el número de argumento que pasamos a printfs
: el formato, en este casos
es string,d
es entero.
Puedes leer más en la documentación oficial.
PHP y sprintf
Como lo dije, la diferencia entre printf y sprintf es que sprintf
devuelve el resultado en lugar de imprimirlo en el flujo de salida. Así:
<?php
$correo = "contacto@parzibyte.me";
$htmlRenderizado = sprintf('<a href="mailto:%1$s">Puedes contactarme en: %1$s</a>', $correo);
echo "Aquí tengo el HTML: " . $htmlRenderizado;
Con esto podríamos obtener el mensaje formateado para guardarlo en una base de datos, concatenarlo con otros componentes y cosas de esas.
Conclusión
En ningún momento digo que esto debe usarse siempre, solamente estoy haciendo un pequeño análisis de cómo printf
viene mejor en algunas ocasiones en donde echo
no.
Todo dependerá de las situaciones a las que te enfrentes, pero siempre es bueno conocer alternativas.
Te invito a leer más sobre PHP aquí.