Estas cuatro funciones de PHP son muchas veces utilizadas de forma indistinta. En principio, las cuatro imprimen cadenas de texto en pantalla y lo más habitual es utilizar echo y print para imprimir texto en general y utilizar print_r y var_dump para imprimir información de variables. Pero cada una tiene sus peculiaridades, peculiaridades a las que voy a dedicar este post.

Funciones vs constructores de lenguaje

La primera gran diferencia es que  print_r y var_dump son funciones reales mientras que echo y print son constructores de lenguaje, no son verdaderamente funciones. Los constructores de lenguaje son partes de un programa formados por uno o varios símbolos léxicos que responden a las reglas del lenguaje de programación; como símbolos léxicos, no se pueden descomponer en otros, es decir, un constructor de lenguaje no puede subdividirse en otros constructores. Por su parte, una función es una parte definida de un programa (no del lenguaje de programación) que realiza una determinada tarea. Cada lenguaje de programación suele proveer de una biblioteca de funciones predefinidas, como es el caso de print_r y var_dump en PHP.

Cuándo el parser interpreta un código, entiende y sabe que hacer con los constructores de lenguaje sin necesidad de más análisis. Cuándo se encuentra con una función, por el contrario, tiene que comprobar las definiciones del leguanje de programación y convertir el código de la función a constructores de lenguaje. En la mayoría de los casos, un constructor de lenguaje se puede utilizar en el mismo contexto que una función. Los constructores de lenguaje suelen ser ligeramente más rápidos que las funciones y no requieren el uso de paréntesis:

<?php
//print es un constructor de lenguaje
print 'Hola';
//La operación anterior es equivalente a
print('Hola');
//print_r es una función, la siguiente expresión es incorrecta y genera error
print_r 'Hola';
?>

echo vs print

Ambos son constructores de lenguaje que muestran cadenas de texto con diferencias algo sutiles. Esta es la forma y tipo de cada uno:

int print ( string $arg )

void echo ( string $arg1 [, string $... ] )

De la definición anterior podemos deducir que:

1

print imprime una cadena, echo puede imprimir más de una separadas por coma:

print 'Hola';
echo 'Hola', 'Hola de nuevo';
2

print devuelve un valor int que según la documentación siempre es 1, por lo que puede ser utilizado en expresiones mientras que echo es tipo void, no hay valor devuelto y no puede ser utilizado en expresiones:

//Se imprime "Hola" y la variable $foo toma el valor 1
$foo = print 'Hola';

//La siguiente expresión da error
$foo = echo 'Hola';
3

Según algunas fuentes, como este blog o w3schools, echo es ligeramente más rápido que print.

print_r vs var_dump

Estas dos funciones imprimen los detalles de una variable, incluyendo su valor, en un formato legible por el humano. Si es un array o un objeto también imprimen los detalles de cada elemento. Se utilizan frecuentemente durante la depuración de código, situación en la que var_dump suele ser más útil por la mayor información que proporciona. Las diferencias:

1

Si el valor de la variable es una cadena de texto, var_dump imprime la cadena entre dobles comillas, print_r no.

2

print_r no imprime nada visible para false y cadenas vacías.

3

var_dump proporciona información sobre el tamaño y tipo de datos de la variable y, en el caso de arrays y objetos, de los elementos que la componen. print_r no da información sobre el tamaño de la variable ni sobre el tipo de datos.

Ejemplo:

$foo = array( 5, 0.0, "Hola", false, '' );

var_dump( $foo );
//Imprime
array(5) {
    [0]=> int(5)
    [1]=> float(0)
    [2]=> string(4) "Hola"
    [3]=> bool(false)
    [4]=> string(0) ""
}

print_r( $foo );
//Imprime
Array (
    [0] => 5
    [1] => 0
    [2] => Hola
    [3] =>
    [4] =>
)
4

print_r puede devolver el resultado en lugar de imprimirlo si se proporciona el segundo parámetro como true:

$foo = array( 5, 0.0, "Hola", false, '' );
$output = print_r( $foo, true );

Referencias

  • lecasabe

    Excelente!!!!

  • Othon

    Sos groso sabelo, añadido a mis favoritos. +10

  • Cristian Moya

    Buenisimo