Diferencias entre un ambiente PHP4 y un ambiente PHP5

Cuando migré mi entorno de desarrollo a la distribución Fedora Core 5, una de las primeras en incluir PHP5 de serie, tuve que hacer "pruebas de compatibilidad" para asegurarme que los sitios que necesitaran seguir usando PHP4 no dejaran de funcionar.

Google Trends mostrando las tendencias de las búsquedas de los usuarios sobre ambas versiones de PHP, comparándolas entre ellas. El salto que hace la línea roja, que representa a PHP5, fue justamente el año de liberación del mismo (2004).

Recientemente se repitió una situación similar: en la universidad donde empecé a dar clases de programación con PHP5 hubo que acondicionar la infraestructura de los laboratorios para que soportaran esta versión. El primer miedo que se generó fue que al actualizar la herramienta los cursos que seguían usando PHP4 se encontraran con el problema de que sus aplicaciones dejaran de funcionar.

Las únicas diferencias que recuerdo me causaron alguna dificultad cuando quise probar sitios PHP4 en el nuevo entorno PHP 5 fueron:
  1. Las variables pasadas por la URL - en PHP4 quedan disponibles inmediatamente, pero en PHP5 es obligatorio usar $_GET, $_POST, o directamente $_REQUEST.
  2. Las variables globales - aunque por suerte nunca usé (no es recomendable), están deshabilitadas en la configuración en PHP5 (register_globals = Off).
  3. Objetos siempre por referencia - en PHP4 todo es por valor a menos que se diga explícitamente (&), en PHP5 los objetos son automáticamente por referencia, no así las variables (que quedan igual que antes, por valor).
Fundamentalmente el punto 1 fue lo único que hizo que alguna aplicación no funcionara.

Con respecto a la configuración general

Existen algunos detalles que recuerdo de la configuración que creo importantes tener presentes ante cualquier problema que pueda surgir (en muchos casos la primer línea comentada con mi sigla EP es la original, la segunda corresponde a mis valores actuales):

; Enable compatibility mode with Zend Engine 1 (PHP 4.x)
; Es el valor por defecto, y php4 debería funcionar de todas formas
zend.ze1_compatibility_mode = Off

;EP error_reporting = E_ALL
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

;EP display_errors = Off
display_errors = On

;EP display_startup_errors = Off
display_startup_errors = On

;EP ignore_repeated_errors = Off
ignore_repeated_errors = On

Documentación del manual

"Aunque PHP 5 ofrece varias características nuevas, está diseñado para ser tan compatible con versiones anteriores de PHP como es posible, y con muy poca funcionalidad afectada en el proceso."

Capítulos del manual oficial: Faq Migration y Migration5

Artículos varios:

No es tan dramático el cambio, pero hay que tener en cuenta estos detalles y hacerlo sin prever las consecuencias de una posible migración de software que luego fuera complicado revertir.

8 comentarios:

Anónimo dijo...

Las variables pasadas por la URL - en PHP4 quedan disponibles inmediatamente, pero en PHP5 es obligatorio usar $_GET, $_POST, o directamente $_REQUEST.

No entiendo lo de "disponibles inmediatamente". ¿Tienes que hacer algo adicional para que las variables pasen a estar disponibles?

Hasta donde sé, esas variables también están "disponibles inmediatamente" en los arrays superglobales en PHP4 y PHP5. Tal vez quisiste decir que se registran como globales automáticamente y se pueden acceder directamente como $nombre_var en lugar de $_GET['nombre_var'].

Algo más: ¿Desde cuándo se puede acceder a las variables pasadas por url a través del array $_POST? Eso sí que es novedad.

----------------

Las variables globales - aunque por suerte nunca usé (no es recomendable), están deshabilitadas en la configuración en PHP5 (register_globals = Off).

Escribiendo esto pareciera que PHP5 se volvió inflexible con el tema de la configuración de la directiva register_globals. Recomendable o no, se sigue pudiendo cambiar. Y la configuración por defecto en OFF no apareció con PHP5, sino desde PHP 4.2. Así que poner esto como una diferencia entre PHP4 y PHP5 me parece un error.

-----------------

Volviendo a lo de "disponibles inmediatamente" (que yo interpreto como "directamente")... Me parece redundante poner los puntos uno y dos, porque, como ya expliqué, register_globals viene por defecto en OFF desde PHP 4.2. Así que desde PHP 4.2 ya tenías que acceder a las variables de url, formulario, sesiones, cookies, etc. a través de los superglobales (o cambiar el estado de la directiva a ON).

Así que de tus tres "diferencias", sólo la tercera me parece válida.

Enrique Place dijo...

Al pasar las variables a través de la URL (método GET) estas se pueden usar directamente sin agregar más código que nombrándolas.

Por ejemplo, en la URL o a través de la ejecución de un formulario html por método GET, en PHP solo referenciaremos a la correspondiente variable definida en el formulario, sin necesidad de hacer nada extra.

En la url dice: http://localhost/prueba.php?saludo=hola+mundo

en prueba.php accedo directamente con solo nombrando la misma:

echo $saludo;

Según la documentación $_POST aparece desde la versión 4.1.0 (algunos cuantos años atrás, si tenemos en cuenta que PHP5 salió en el 2004).

> Escribiendo esto pareciera que
> PHP5 se volvió inflexible con el
> tema de la configuración de la
> directiva register_globals.

En todos los artículos oficiales que encuentres sobre la evolución de PHP hablan de evitar usar las variables globales, cosa que ya sugieren explícitamente en PHP5 (pero por compatibilidad hacia atrás con los desarrolladores duros a las actualizaciones y a cambiar su forma de trabajo) y que en PHP6 se quita completamente.

> Recomendable o no, se sigue
> pudiendo cambiar. Y la

Porque hay desarrolladores necios que se siguen resistiendo a aceptar los cambios, como ser la programación orientada a objetos.

Principalmente muchos de estos cambios están para dotarle de herramientas al lenguaje PHP para que pueda trabajar orientado a objetos de forma más robusta, similar a Java (pero sin ser tan estricto: sigues sin necesitar definir explícitamente el tipo de una variable, pero puedes hacer controles "de tipo" al pasar parámetros y además, "downcasting").

> configuración por defecto en OFF
> no apareció con PHP5, sino desde
> PHP 4.2. Así que poner esto como
> una diferencia entre PHP4 y PHP5
> me parece un error.

Puede ser una imprecisión de mi parte pues no recordaba que en las versiones anteriores como ser PHP4.2 ya vinieran de esa forma.

La idea general que quiero transmitir es: "no uses variables globales, sugieren hace años no usarlas, ya te están avisando en PHP5 y en la versión PHP6 ya no existen" (entre otras cosas).

> Así que de tus tres
> "diferencias", sólo la tercera me
> parece válida.

Felicitaciones. Creo que aclaro en el artículo que no es un "dictado de cátedra", solo lo que recuerdo que hay que tener en cuenta, principalmente en esencia, no estaba buscando escribir un libro científico al respecto.

Pasa por caja a que te devuelvan el dinero. ;-)

Anónimo dijo...

>La idea general que quiero
>transmitir es: "no uses variables
>globales, sugieren hace años no
>usarlas,


El título de tu ¿artículo? dice "Diferencias entre un ambiente PHP4 y un ambiente PHP5", no dice "Recomendaciones para trabajar mejor en PHP".

-----------------------
>Puede ser una imprecisión de mi
>parte


¿Puede ser? ¿Tanto te cuesta admitir un error?

------------------------
>pues no recordaba que en
>las versiones anteriores como ser
>PHP4.2 ya vinieran de esa forma.


Puedes revisar el manual, donde dice:
Version 4.2.0
22-Apr-2002
* ATTENTION!! register_globals defaults to 'off' now !!!


--------------------
>Felicitaciones. Creo que aclaro
>en el artículo que no es un
>"dictado de cátedra", solo lo que
>recuerdo que hay que tener en
>cuenta, principalmente en esencia,
>no estaba buscando escribir un
>libro científico al respecto.


Y yo te repito que el título dice "Diferencias (...)". Obviamente por este camino de soberbia estás lejos de escribir un libro científico (al menos uno bueno). Como dicen: "el papel (el teclado, en este caso) aguanta todo".

----------------------
>Pasa por caja a que te devuelvan
>el dinero. ;-)


Si no quieres ser criticado (veo que siempre reaccionas muy mal ante las críticas), no publiques cosas simplemente por publicar algo, o desactiva los comentarios de tu blog.

Por un moemento estuve interesado en tu curso, pero odio a los profesores "dueños de la verdad".

Por si alguien más se decepcionó con este ¿artículo?, les dejo el enlace a la documentación donde se recogen las incompatibiladaes entre PHP4 y PHP5

Enrique Place dijo...

> El título de tu ¿artículo? dice
> "Diferencias entre un ambiente
> PHP4 y un ambiente PHP5", no dice
> "Recomendaciones para trabajar
> mejor en PHP".

Disculpa, Jorge, tal vez es cansancio o mi alergia a las críticas destructivas cuando no se tiene un mínimo de comprensión lectora.

Ojo, no digo que seas tu, puede ser mi cansancio y al ver cosas del tipo <comillas>artículo</comillas> que dan impresión de despectivo.

> ¿Puede ser? ¿Tanto te cuesta
> admitir un error?

(Si, debe ser mi cansancio, estoy viendo alucinaciones)

Tu estás criticando el "artículo" como si fuera un estudio que describe las diferencias exactas entre PHP4 y PHP5, y lo que yo estoy describiendo claramente en todo el contenido es "lo que recuerdo que hay que tener en cuenta cuando se cambia de un entorno con PHP4 a otro con PHP5, a grandes rasgos, y el contexto son las aplicaciones viejas que venían corriendo en PHP4 y porqué pueden dejar de andar en PHP5, y los recaudos que hay que tomar".

En algún punto tu te fuiste "al carajo y más allá" (parafraseando a Toy History).

En ningún momento digo que en PHP5 empezó a usarse esa configuración, digo que lo que recuerdo es que hay que tener en cuenta que PHP5 tiene esa configuración por defecto. Por eso digo "puede ser una imprecisión" pues aunque no sea una descripción extremadamente abundante, no está equivocada, porque el punto que estoy comunicando es otro.

> Puedes revisar el manual, donde
> dice:
> Version 4.2.0
> 22-Apr-2002
> * ATTENTION!! register_globals
> defaults to 'off' now !!!

Si, debe ser mi cansancio que veo que tus comentarios son muy tendenciosos. Comenté que "no recordaba" porque fui hasta el manual y confirmé lo que tu decías (no veo porqué te tengo que contar exactamente todo lo que hago, puedes tratar de interpretarlo)...

Ahora mi pregunta es: ¿el problema soy yo o eres tu? ¿estás buscando algún tipo de protagonismo?

> Y yo te repito que el título dice
> "Diferencias (...)". Obviamente
> por este camino de soberbia estás
> lejos de escribir un libro
> científico (al menos uno bueno).
> Como dicen: "el papel (el
> teclado, en este caso) aguanta
> todo".

Si, sigo convencido que es mi cansancio y estoy viendo alucinaciones.

Tu problema es de compresión lectora y en tratar de buscar "la quinta pata al gato", y tal vez, alguna revancha contra mi persona (serás alguno de los talibanes de algún evento que participé recientemente y que no le gustó que les criticara en la cara?).

> Si no quieres ser criticado (veo
> que siempre reaccionas muy mal
> ante las críticas), no publiques
> cosas simplemente por publicar
> algo, o desactiva los comentarios
> de tu blog.

Tolero las críticas y hasta los ataques directos, más los disfrazados como críticas. Lo que tu debes tolerar, y ese veo que es tu problema, es que yo responda a los mismos.

Yo acepto e invito a discrepar, y en lo posible con altura. El problema es que de la misma forma que yo debo aceptar las críticas (de lo contrario ni te respondería, como hacen muchos bloggers, además de tildarte automáticamente de "troll") tu tienes que aceptar las mías... y ambos tenemos que aceptar que no tenemos por qué ponernos de acuerdo, ni nadie tiene la última palabra. Yo no busco que tu me des la razón, solo respondo a tus afirmaciones; ¿tu que buscas, que te de la razón?

> Por un moemento estuve interesado
> en tu curso, pero odio a los
> profesores "dueños de la verdad".

¿"Odio"? ¿"odias profesores"? Veo que vienes con otros problemas detrás.

Y lo de "dueños de la verdad" ya lo entiendo: buscas ir a un curso que el docente te reconozca que tu eres "dueño de la verdad"?

De alguna forma u otra, el docente debe ser "dueño de la verdad" dentro del ámbito de la clase (para eso la dicta), pero en mi caso aclaro que esa "es mi verdad" y no busco imponerla, es más, aclaro constantemente que cada uno debe buscar la propia, y que fuera de clase lo que importa son las experiencias personales, las conclusiones de cada uno, los criterios de cada uno.

Si leyeras tranquilo, usando "comprensión lectora", verías en varios lugares que digo "tratar de aprender a pescar, no a comer de mi mano".

> Por si alguien más se decepcionó
> con este ¿artículo?, les dejo el
> enlace a la documentación donde
> se recogen las incompatibiladaes
> entre PHP4 y PHP5

Un "post" ("entrada", "escrito", etc) no necesariamente es un "artículo" formal. Esto es un blog personal (todos lo son al final de cuentas) y me tomo las libertades que me corresponden.

Lamentablemente suceden este tipo de situaciones cuando se busca ver algo que no es concretamente lo que te están ofreciendo.

PD: estás repitiendo los enlaces a la documentación oficial, ya estaban colocados al final del artículo, por lo cual te contradices... no leíste ni comprendiste nada de lo que está escrito.

Ojo, todo te lo digo con el mayor de los respetos que tus comentarios me merecen.

Unknown dijo...

Amigo enrique, acepta las críticas, que no tienes razón.

Y si no te gusta, chápate el blog y dedícate a otra cosa.

au!

Rosa dijo...

A mi si me gusto tu artículo, muchas gracias por la información.

Saludos!
rvargas

Unknown dijo...

aunque el articulo si contiene errores, me parecio un poco despectiva la critica que recibio, siempre es importante criticar constructivamente y aportar mas informacion cuando algo no esta bien planteado.

Jose Molina dijo...

Saludos

Han encontrado alguna incidencia con el uso de urldecode al pasar del php4 al php5 ??

Entradas populares