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.

Consideraciones sobre el uso del Patrón Singleton desde un entorno web con PHP

Uno de los usos habituales del Patrón de Diseño Singleton es concentrar en un único objeto todas las llamadas a la base de datos y que este se encargue de que nuestro sistema use una única conexión, compartida por todos los que la necesiten.

La lógica del patrón es simple

La lógica es simple, la primera vez que alguna parte de nuestro sistema necesita conectarse a la base de datos, se le pide una instancia de conexión al Singleton implementado en nuestra clase de Persistencia (una clase que separa nuestro código de "lógica de negocio" del código explícito para trabajo con base de datos). Si en las siguientes peticiones esta instancia existe, el Singleton devuelve siempre la misma, así se reutiliza sin crear nuevas.

Ventajes del uso del patrón

Esto evita que nuestro sistema, en un momento dado, tenga innumerables y descontroladas conexiones a la base de datos, consumiendo recursos y tal vez, el máximo permitido por vez (configurado en la misma base de datos). A su vez, al tener todas las conexiones centralizadas, podemos implementar todo tipo de controles y auditorías (registrar cantidad de conexiones, que partes de nuestro sistema realiza más conexiones, horarios para las mismas, etc, etc).

El problema

Lo habitual en "sistemas de escritorio" (no web) es que esta instancia se mantenga generalmente durante toda la vida del sistema, lo cual sería acertado decir que la instancia reutilizada de conexión es siempre la misma (única). Pero en ambientes web, el contexto es distinto y la forma de trabajo cambia.

Por esta razón es muy común que se repita la siguiente consulta en foros:

"Una vez ejecutado el patrón en un página/fuente/scripts, los objetos se destruyen, desapareciendo la instancia del Singleton. Por lo que si se ejecutara nuevamente, todo volvería a repetirse de cero, y no se aprovecharía en toda la aplicación, solo por página."

El problema es ese, el mundo "stateless" ("estado desconectado") de la web, donde queda claramente evidenciado al intentar implementar el patrón "Singleton".

Cuando tu estás, por ejemplo, en una aplicación desktop hecha en Java, tu código está siempre corriendo, de forma permanente. Si tu creas una conexión con la base de datos, siempre estará ahí mientras viva la aplicación (o te desconecte el servidor de base de datos, etc), y cada vez que invoques el "singleton" este funcionará correctamente en todos los casos.

En situaciones "típicas" de la web (sin las conexiones persistentes), luego de terminar la ejecución de un página, pasamos al "estado desconectado" y perdemos todos los objetos. En este contexto, solo tendría sentido el "singleton" si tu página debe hacer llamadas a varios objetos que tienen acceso a la base de datos y tu quieres tener control sobre estos accesos.

Pero luego de concluida la página (terminamos de ejecutar la última línea de nuestro php) terminó la función del "singleton", y el próximo contexto será una nueva ejecución de la página, esta misma u otra distinta.

Conclusiones finales

Resumiendo, serían:

"Se puede implementar perfectamente el patrón Singleton con PHP, pero por el contexto web, este se aplicará normalmente durante la vida de una única página, a menos que implementemos algún mecanismo para persistir el objeto Singleton y así lograr que este perdure durante toda la vida de la aplicación web"

Estas son mis conclusiones aplicadas al mundo PHP desde el mundo Java; si no les gustan, tengo otras

Artículo basado en una respuesta que di en Foros del Web:

Smarty: cambiar el idioma del "html_select_date"

El motor de templates Smarty dispone de muchos comandos que una vez invocados generan un componente (compuesto por código html) para nuestra interfaz web.

En este caso concreto conoceremos a html_select_date, que con solo invocarlo dentro del código de un formulario (encerrado entre los tags <form> y </form>) generará 3 combos con el día, mes y año. Esto es útil para cuando queremos hacer un formulario que consulte a partir de una fecha, o entre un rango de fechas. Smarty nos da las herramientas para no tener que lidiar con el código html y poder rápidamente disponer de estos componentes.

Nota: deberemos contar con una estructura base para poder poner esto en funcionamiento.

En nuestro archivo de template deberemos tener el código estándar html para el formulario, más el tag correspondiente para el componente generado por Smarty:


<form NAME="form1" ACTION="generarConsulta.php">

<!--{html_select_date}-->

<button name="Aceptar">Aceptar</button>

</form>


Y esto generará el siguiente resultado:


También podríamos hacer un formulario que tuviera un rango de dos fechas para filtrar los datos de nuestra consulta, por que lo que podríamos hacer el siguiente código, ajustando algunos parámetros:


Que dará por resultado la siguiente interfaz:

La documentación sobre este componente es muy clara, ofreciéndonos varios parámetros para adecuar el mismo a nuestras necesidades.

Pero el primer problema que nos encontramos, y que no aparece claramente en la documentación, es como cambiar el idioma del contenido del mismo (como se ve en ambas capturas de pantalla, los meses se encuentran en inglés).

Aprender a pescar, no a comer de la mano

Consejo: cuando no encuentres algo en la documentación de Smarty, ve al foro del sitio oficial (enlace arriba a la derecha) y busca dentro de las consultas de los usuarios... y generalmente encontrarás lo que buscas.

Smarty usará la configuración del idioma, fechas, etc, que venga definido desde el entorno de PHP, por lo que deberemos para este caso tener correctamente la fecha configurada con setlocale:


setlocale (LC_TIME,"spanish");

Y obtendremos el resultado esperado:


Si no sabes como empezar a trabajar con Smarty, además de sugerirte que recorras el manual (que tiene una versión en castellano), puedes ver otros artículos que he escrito al respecto.

Espero que te sea útil este "detalle" del idioma ;-)

¡Hoy iniciamos el curso en Universidad ORT!

Confirmando: el curso finalmente se abrió y los días asignados son los lunes y miércoles, de 19:30 a 22:30... y hoy es oficialmente la primera clase. ;-)

En primera instancia eran los martes y jueves, pero me informó la administración de ORT que siempre es una locura esta semana, entre la apertura de las carreras y los cursos, se están moviendo de salón constantemente, y por una razón locativa (somos un grupo reducido) quedamos asignados en estos días.

Con respecto al "podcast", al momento no dispongo de los recursos técnicos para hacer una grabación digital de la clase (todavía no me doy por vencido, veremos que se puede solucionar).

Con respecto a los materiales, estoy viendo de dejarlos disponibles en la web (no será lo mismo sin acompañar con explicaciones, pero por lo menos es un registro de la ruta seguida).

Dentro de algunas horas, más novedades.

En los próximos días iniciamos el curso "Desarrollo de Sistemas Web con PHP5"

Quiero recordar a los posibles interesados en el tema de Desarrollo de Sistemas Web Orientados a Objetos basados en el lenguaje PHP5 y en conocer todas las herramientas disponibles para potenciarlo, que estaríamos abriendo el primer curso los próximos días de la semana que viene en la Universidad ORT.

A pesar de que ya he dictado con esta temática capacitaciones a medida para empresas, este es el primer curso de inscripción abierta que se dicta en la plaza.

Como hay que pagar el derecho de piso por ser un curso completamente nuevo y casi desconocido en el mercado, pero que ha generado muchas expectativas por su rico y extenso contenido, se ha decidido abrirlo a pesar de que el primer grupo pueda ser reducido.

También podrán conocer un breve resumen que describe mi visión personal del contenido del curso.

Veremos lo último de lo último del ambiente PHP, tratando de subir el perfil de los desarrolladores al nivel de plataformas como Java o .Net, y si no lo vemos en el curso, es porque no existe siquiera una beta para probarla ;-)

No dejes que mañana vengan a discriminarte en una entrevista de trabajo con el título de "Programador PHP" (alguien que conoce el lenguaje y que solo sabe hacer "scripts estructurados") o "Diseñador PHP" (que sabe algo de diseño web y muy poco de programación de sistemas). Tu puedes conocer y entender todas las disciplinas necesarias para ser un Desarrollador de Sistemas Web Orientados a Objetos.

¿Seremos conformistas con nuestros conocimientos o nos animaremos a evolucionar?

¿Vas a participar de la "Era Web" como usuario o como desarrollador?

Muchos de los temas que vamos a ver se dan a lo largo de una carrera de más de 2 años (UML, Diseño OO, Patrones de Diseño, Refactoring, Frameworks, Webservices, Ajax, etc).

Si te gustan los retos, te espero ;-)

Entradas populares