printf y sprintf en PHP

printf y sprintf son funciones típicas de la librería stdio.h de C, que también están disponibles en PHP. printf quiere decir “print formatted” y sprintf quiere decir “string print formatted”. ¿Para qué se usan? ¿Qué diferencia hay? ¿Por qué deberías usar estas funciones más en vez de concatenar cadenas todo el tiempo?

printf se usa para escribir un texto en la salida estándar (en una consola; en una página web si el programa es un CGI…). sprintf se usa para lo mismo que printf, pero en vez de escribirlo en la salida estándar, lo devuelve como una cadena de caracteres. Hablo más en profundidad sobre printf (y sprintf) en este artículo que publiqué hace un tiempo en Makigas.

sprintf funciona exactamente igual que printf, pero devolviendo una cadena de caracteres con los datos compuestos. ¿A dónde quiero llegar con todo esto? En PHP tenemos también un printf y un sprintf. Y desde que descubrí sprintf, lo uso para todo. Funcionan exactamente igual que la concatenación de variables típica de PHP, pero son más elegantes y se mantienen mejor.

Cuando necesitamos imprimir una variable en pantalla junto a más texto, tenemos dos alternativas. La primera es concatenar las cadenas y las variables como un puzzle usando el operador de concatenación. Por ejemplo:

<?php
$dni = $numero_dni . '-' . obtenerLetraDNI($numero_dni);
echo 'Nombre: ' . $nombre . '. Apellidos: ' . $apellidos;
?>

La segunda, es usar printf y scanf. Si las conocéis de C, tardaréis diez segundos en integrarlas a vuestro código. printf puede usarse para enviar a la salida estándar (típicamente a la página web mostrada en el navegador) un texto formateado donde podemos imprimir varias variables. sprintf puede usarse para componer una variable de tipo cadena compuesta con un formato.

El mismo ejemplo anterior puede reescribirse con estas dos funciones.

<?php
$dni = sprintf('%d-%s', $numero_dni, obtenerLetraDNI($numero_dni));
printf('Nombre. %s. Apellidos: %s', $nombre, $apellidos);
?>

Observa como en el ejemplo anterior, la primera línea recibe la letra del DNI como una cadena de caracteres (placeholder %s). Aunque sepamos que se va a imprimir una letra, debemos tener en mente que será una cadena de caracteres, de un caracter. (El placeholder %c funciona igual en PHP que en C, si le hubieramos dicho %c esperaría una variable entera para imprimir su código ASCII).

Una lista completa de placeholders y usos más complejos pueden encontrarse en la documentación que hay en la web de PHP.