print vs echo

print y echo son equivalentes en PHP pero si que poseen sus diferencias, echo permite varias argumentos separados por comas, mientras que print admite solo un argumento y la concatenación al hablar de print debe ser con un punto. Por eso es que si intentamos concatenar con comas usando print el IDE que habitualmente usamos nos marcaria esa linea de código como error.

El error saldria en la vista al cargarla en el navegador o dependiendo de tu configuracion de php, si no sale (sale la pagina en blanco) el log de Apache te lo dira igual:

PHP Parse error:  syntax error, unexpected ',' in /var/www/pruebas/persona1.php on line 54, referer: http://localhost/pruebas/

Si print devuelve bien su proceso, al parecer operacionalmente print devuelve 1 que podríamos entenderlo como un valor booleano true pero de forma numérica. En la misma web de php asi se indica, que print siempre devuelve 1 (mientras que echo no devuelve nada). Por lo que se entiende, nunca devolveria 0 ya que seria un error de sintaxis y esto no saldria en la vista, sin salida real mas que un error en el log de apache.

En pruebas de velocidad/respuesta, echo es mas rápido que print, porque print se toma su tiempo para procesar y retornar el valor de 1 mientras que echo como no retorna nada, es algo mas rápido en su salida que print,  pero se podria considerar que la diferencia en velocidad de respuesta entre uno u otro es poca como para marcar una “gran” diferencia de respuesta, pero aun así, observamos que en muchos instructivos, libros, etc de PHP los ejemplos de código referente a la salida de datos, el mas usado es echo y efectivamente así es, echo es mas usado que print.

En el foro de PHP de Venezuela su Administrador abrio un post con algo tan sencillo como esto:

<?php
echo '1' . (print '2') + 3;
?>

Recordando que la gente de PHP indica en su pagina que print siempre devuelve 1, por ejemplo si hicieramos esto:

<?php
    $var;
    print $var;
?>

Eso mostraria un 1 en la vista, mientras que si usamos echo $var; no mostraria nada porque echo no retorna nada como ya se habia dicho antes.

Vamos a agregar un poco mas para ver mas ampliamente el resultado de todo esto:

<?php
echo '1' . (print '2') . "<br />"; // 211
 echo '2' . (print '6') + 3 . "<br />"; // 624
 echo '3' . (print '6') + 3 . "<br />"; // 634
 echo '3' , (print '6') + 3 , "<br />"; // 364
 echo '1'  + 3 , "<br />"; // 4
 echo '1' . + 3 , "<br />"; // 13
 echo '1' , (print '2') , "<br />"; // 121
 echo '1' , (print '2') + 3 , "<br />"; // 124
?>

Se había comentado que echo es mas rápido que print, aunque por alguna razón, el valor que sale primero es el de print, por lo que se aprecia, print se parsea primero, se consideraría que esto sucede porque internamente se están concatenando y sumando los valores, mientras que el ‘2’ del print solo llega y se pone a la vista.

Viendo internamente el 1ero: el 1 del echo, el 1 del return del print (‘1’ . ‘1’) se concatenan quedando un ’11’ en formato string. Sale primero la impresion del 2 seguido del proceso interno, quedando un 211 en la vista.

Viendo internamente el 2do: el 2 del echo se concatena con el return 1 del print, quedando asi ’21’+3=24, se carga en la vista primero la impresion del 6 y luego el proceso interno entre el echo y el print, saliendo finalmente un 624.

El 3ero: ‘3’ . ‘1’ –> (1 return del print)… ’31’ + 3 = 34… En la vista sale primero el valor del print, que es 6 (no su return), quedando asi 634

El 4to: Este no concatena con (puntos) . sino con (comas) , lo cual aun siendo igual que el 3ero en valores, el orden de los datos no es igual. ‘3’ , ‘6’ = ’36’ luego el 1 del return del print se suma con el +3 (no se concatena porque no hay un (punto) . antes del signo +), por lo que seria ‘1’ + 3 (sea 3 o sea ‘3’ igual se sumaran), quedando esos dos sumados a ‘1’+3=4 por lo que el numero de salida terminaria siendo 364.

El 5to: ‘1’ + 3 = 4

El 6to: ‘1’ . +3 = 13 –> Como hay un (punto) de concatenacion antes del + esto hace que no se sume a 14 sino que se concatene a 13.

El 7mo: ‘1’ , 2 , 1 –> (1 del return del print): 121

El 8vo: ‘1’ , 2 , ‘1’ + 3 = ’12’ , ‘1‘+3 = ’12’ , 4 = 124 donde el 1 en rojo es el 1 del return del print.


About this entry