68

Está claro que las ¿funciones?

  • echo
  • print
  • print_r
  • var_dump y
  • var_export

son usadas casi indistintamente para imprimir contenido en pantalla.

El objetivo de esta pregunta es tener una buena respuesta que sirva como referencia para entender las posibles diferencias entre cada una de ellas... si es que hay diferencias.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • 3
    Buena matización en ¿funciones? ya que tanto `echo` como `print` son **construcciones** de lenguaje. – Muriano May 30 '17 at 11:59
  • 4
    Vengo a reclamar por los derechos oprimidos de **[var_export](http://php.net/manual/es/function.var-export.php)**. Esto es discriminación! – Mariano May 30 '17 at 13:28
  • @Mariano ¡var_export! OMG, confieso que nunca lo he usado. ¿Crees que se debería incluir? – A. Cedano May 30 '17 at 13:50
  • @Muriano Correcto, por eso los signos de interrogación. Por cierto, eso de _construcciones de lenguaje_ lo he leído, sospecho el por qué, el origen, etc, pero no me queda del todo claro :) – A. Cedano May 30 '17 at 13:51
  • 3
    @A.Cedano es mi primera opción, ya que permite copiar el resultado y usarlo directamente en el código. Más aún con respecto al sitio: es la mejor salida para publicar en una pregunta... No creo que los que respondieron se enojen si les dejás un comentario – Mariano May 30 '17 at 13:52

2 Answers2

59

Me gustó tu pregunta, encontré una relacionada en el sitio en inglés, puedes darle un vistazo aquí, me tomaré el tiempo de traducir parte de lo respuesta con mejor votación en la pregunta anteriormente mencionada, empecemos:

echo

  • Muestra una o más cadenas separadas por comas
  • No tiene un valor de retorno
  • Ejemplo:

    echo "Cadena 1", "Cadena 2";
    

print

  • Muestra solo una simple cadena
  • Devuelve 1, por lo cual puede ser usada en una expresión
  • Ejemplos:

    print "Hello";
    if($expresion && print "Cadena"){
        // Hacer algo
    }
    

print_r()

  • Muestra una representación más entendible de un solo valor cualquiera
  • No solo acepta cadenas, también acepta arreglos y objetos formateándolos para ser visualizados de una forma más entendible
  • Puede devolver su valor de salida como un valor de retorno si le pasa true como su segundo argumento
  • Útil para la depuración

Ejemplo: Si tenemos el siguiente arreglo:

$a = array ('a' => 'manzana', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));
print_r ($a);

Nuestro print_r($a); nos devolverá algo como esto:

Array
(
    [a] => manzana
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
        )
)

var_dump()

  • Muestra una representación más entendible de un valor cualquiera o más separados por comas
  • No solo acepta cadenas, también acepta arreglos y objetos formateándolos para ser visualizados de una forma más entendible
  • Usa un formato diferente al anterior print_r(), por ejemplo, también muestra el tipo del valor
  • Útil para la depuración
  • No tiene un valor de retorno

Ejemplo: Si tenemos el siguiente arreglo:

$a = array(1, 2, array("a", "b", "c"));
var_dump($a);

Nuestro var_dump($a); nos devolverá algo como esto: (nótese que nos muestra el tipo de valor de cada elemento en nuestro arreglo)

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}

var_export()

  • Muestra una representación más entendible y ejecutable de un valor cualquiera
  • No solo acepta cadenas, también acepta arreglos y objetos formateándolos para ser visualizados de una forma más entendible
  • Usa un formato de salida diferente de var_dump() y print_r(), la salida es un código de PHP válido
  • Útil para la depuración
  • Puede devolver su valor de salida como un valor de retorno si le pasa true como su segundo argumento

Ejemplo, si realizamos lo siguiente

class A {
    public $var; 
}

$a = new A;
$a->var = 5;

var_export($a);

Obtendremos como resultado:

A::__set_state(array(
   'var' => 5,
))

NOTAS

  • echo es mucho más rápido que print
  • echo y print son constructores de lenguaje
  • print_r() y var_dump() son funciones
  • echo y print pueden recibir sus argumentos mediante paréntesis como una función echo("Hello", "world"); ó print("Hello World");
Eduardorq
  • 631
  • 1
  • 8
  • 20
Jorius
  • 6,109
  • 9
  • 28
  • 55
  • Gracias. Me gustaría que incluyeras las posibles diferencias también de `var_export()`. Ver comentario de @Mariano en la pregunta misma. – A. Cedano May 30 '17 at 13:58
  • 3
    @A.Cedano listo, he añadido información respecto a var_export(), he estado buscando más información al respecto porque no me queda muy claro el concepto de esta función, si encuentro algo mejor sin duda lo añado – Jorius Jun 01 '17 at 18:55
  • La traducción de "array" como "arreglo" es incorrecta, es un "falso amigo". La traducción correcta sería "matriz", o simplemente dejarlo como array (todos lo entendemos). En español no hay ninguna acepción en la que "arreglo" pueda referirse a una matriz de datos. – skeptic Aug 23 '21 at 12:15
29

La primera gran diferencia es que print_r y var_dump son funciones reales mientras que echo y print no son verdaderamente funciones sino constructores de lenguaje.

<?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 (https://www.w3schools.com/php/func_string_print.asp) 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 );
    

var_export vs var_dump y print_r

Imprime códgo php válido. Es útil si calculas valores que deban ser constantes en otros scripts. Hay que observar que var_export no maneja referencias de arrays cíclicos/recursivos, mientras que var_dump y print_r si. Además, var_export imprimer el resultado por defecto, pero habilita la posibilidad de devolver una cadena definida usando el parámetro opcional $return

<?php
class A
{
    public $var1;
    public $var2;

    public static function __set_state($an_array)
    {
        $obj = new A;
        $obj->var1 = $an_array['var1'];
        $obj->var2 = $an_array['var2'];
        return $obj;
    }
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
                                            //    'var1' => 5,
                                            //    'var2' => 'foo',
                                            // ));
var_dump($b);
?>

Esto imprimirá:

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

Puedes encontrar más infromación en: (https://cybmeta.com/php-diferencias-entre-echo-print-print_r-y-var_dump)

Héctor
  • 1,774
  • 8
  • 13