Novedades PHP 7

PHP logoLa siguiente versión de PHP, la 5.7, planificada hacia finales de este año, ha sido reemplazada por PHP 7, que, de acuerdo a su timeline, tiene previsto lanzamiento más allá de octubre de 2015. Aunque a partir de junio ya podrían estar disponibles las primeras Release Candidate (RC).

Así que quedan por delante unos meses de trabajo duro, sobre todo para los proyectos de software libre, que con toda probabilidad serán los primeros en adoptar las nuevas características y funcionalidades.

En el debate sobre el nombre de esta nueva versión, y en su posterior votación, se tomo la decisión de nombrarlo con PHP 7, en lugar de PHP 6, lo que supone saltar directamente de PHP 5.6 a PHP 7. Si el lector no ha seguido el debate puede resultar curioso, incluso desconcertante, que se haya saltado una versión, pero había mucho en juego en esta decisión.

La constante evolución de PHP trae consigo nuevas características, sobre todo cuando se trata de lanzamientos importantes, aunque la mayoría de versiones se corresponden con correcciones de errores. Muchos usuarios están deseando ver nuevas versiones y beneficiarse de las nuevas características que traen consigo.

Pero otros ven en esa evolución su cara menos favorable, toca lidiar con cambios incompatibles con versiones anteriores, donde su código funciona perfectamente. Lo que significa invertir más horas de trabajo en dejar todo a punto, por no hablar de los dolores de cabeza al tratar de arreglar el código roto por esos cambios.

Con este telón de fondo, el nombre de la nueva versión de PHP sirve para que todos sepamos que ese número define una serie de cambios y va a implicar una revisión del código de nuestros programas para asegurarnos que todo funciona como debería.

Aquellos que defendían PHP 6 afirmaban que es el siguiente número lógico, pues la versión actual es PHP 5. Pero esto entra en un pequeño conflicto con el nombre de una rama de desarrollo bautizada como PHP 6, que pretendía dar soporte Unicode a la manipulación de texto en PHP, y que quedó definitivamente muerta en 2010. Con esto PHP 6 podría confundirse con esa rama y la mayoría de desarrolladores prefirieron evitar esa confusión, por lo que la nueva gran versión de PHP será PHP 7.

Estas son algunas de las novedades ya implementadas para PHP 7:

  • Tipado en el retorno de funciones: Una característica ampliamente discutida y que permitirá tipar el retorno de una función con los valores que debe retornar, se interpondrá el valor de retorno tras los argumentos y antes de la apertura de llaves, precedido por dos puntos [RFC]
  • Declaraciones de tipos escalares: Tipado de escalares permitiendo int, float, string y bool, se utilizará combinado con declare(strict_types=1), que debe incluirse en la primera línea [RFC]
  • Quitar los warnings de date.timezone: Ya no será necesario definir esta configuración en un archivo INI o a través de la los ajustes en línea de comandos [RFC]
  • Arreglar el comportamiento de «foreach»: En algunos casos extremos, «foreach» tiene un comportamiento extraño. Estos casos están relacionados con la manipulación con puntero interno, por lo que el resultado depende de si es una referencia o no (en el RFC hay ejemplos de esas inconsistencias) [RFC]
  • Mayor rapidez al parsear parámetros en la API: Las funciones internas de PHP utilizan zend_parse_parameters para recibir los valores en variables C, que a su vez usa scanf() como método para definir los parámetros y analizar esa cadena en cada llamada, lo que provoca un consumo de recursos significativo [RFC]
  • Sintaxis de escape de punto de código Unicode: Permite agregar una sintaxis de escape de punto de código Unicode en literales de cadena, con el formato \u{202E} con comillas dobles o formato heredoc [RFC]
  • Operador ternario con isset: Con el operador ?? (doble fin interrogación) se simplifica la comprobación con operador ternario «$username = isset($_GET[‘user’]) ? $_GET[‘user’] : ‘nobody’;» por «$username = $_GET[‘user’] ?? ‘nobody’;» [RFC]
  • Comportamiento de enteros: Mejoras en la consistencia entre plataformas para el retorno en las operaciones con enteros, haciéndolo más intuitivo [RFC]
  • Fallo desbordamento ZPP: Corrige el error de magnitud que provocado por pasar un número con decimales cuando debería ser un entero, modificando la magnitud del entero al ser truncado en algunas plataformas [RFC]
  • Árbol de sintaxis abstracta: Añadido un árbol de sintaxis abstracta como un intermediario en el proceso de compilación, lo que mejora el mantemiento del parser y el compilador, y desacopla las decisiones de sintaxis de las cuestiones técnicas. Provoca cambios en list(), yield, etc [RFC]
  • Sintaxis uniforme de variables: Soporte completo a construcciones de variables, que aunque poco utilizadas, no tienen consistencia internamente [RFC]
  • Inconsistencia de list(): list() no puede ser utilizado con cadenas, pero en algunos casos si que lo hacía, esta mejora arregla esa inconsistencia [RFC]
  • Eliminar soporte hexadecimal en conversión de cadenas numéricas: Solucionar la inconsistencia entre is_numeric_string y cast cuando se convierte un hexadecimal [RFC]
  • Declaraciones de «use» en grupo: Agrupar varias definiciones de «use» a través de llaves, para especificar varios estamentos con llaves ({ }) [RFC]
  • EngineException: Usar EngineException para permitir capturar errores con excepciones [RFC]
  • Permitir «return» en iterators: Permitir el uso de «return» una vez finalizado el uso del iterator y retornados sus valores con yield [RFC]

Estas novedades están aceptadas:

  • Operador combinado de comparación (<=>, spaceship): En $a <=> $b, retorna -1 cuando $a es menor que $b, 0 en el caso de ser iguales y 1 cuando $a sea mayor que $b (del mismo modo que strcmp()) [RFC]
  • Reemplazar la extensión json por jsond: El actual Json Parser en la extensión json no tiene una licencia libre, por lo que algunas distribuciones de Linux no tienen soporte para Json, reportado en Bug #63520. Además el código de la extensión es muy viejo y sin alguien que lo mantenga hace dificil añadir nuevas mejoras [RFC]
  • Mejoras en la longitud de cadenas y enteros en plataformas de 64 bit: Permitirá trabajar a PHP de forma consistente con cadenas y enteros en cualquier plataforma de 64 bits [RFC]
  • Closure::call: Permite hacer llamadas a Closures a través del método call [RFC]
  • Eliminada tags de sintaxis alternativa: Eliminación de los script tags (script language=php) y tags ASP (<% %>), junto con sus variantes [RFC]
  • Multiples default en switch: Solución al bug que no emite un sintaxis error cuando se definen múltiples default case para un switch y ejecuta el último definido [RFC]
  • Capturar «call to a member function of a non-object»: Convertir las llamadas a métodos sin objetos a E_RECOVERABLE_ERROR, para permitir capturarlos y no detener la ejecución [RFC]

En estas todavía en fase de votación:

  • Quitar SAPIs y extensiones no disponibles o no soportadas: Algunas extensiones y módulos no tienen soporte o no están disponibles, como es el caso de apache, thttpd, mssql, ereg, etc [RFC]
  • Filtrar unserialize(): En PHP la función unserialize() tiene ciertos problemas de seguridad relacionados con la falta de control de los datos que se obtienen, la propuesta es poder filtrar la carga a una lista blanca de objetos [RFC]

Frameworks PHP: Zend vs Symfony

Cuando uno se plantea por primera vez el uso de un framework en PHP comienza a darle vueltas a las posibilidades que ofrecen unos y otros. Aunque la curva de aprendizaje en el uso de un framework es dura, todo el tiempo que le dediquemos a conocer a fondo aquel por el que nos decidamos será el tiempo mejor invertido en formarnos como desarrolladores.

En este caso quiero plantear una comparación entre dos de los frameworks más extendidos Zend y Symfony.

Documentación y aprendizaje. Com he dicho la curva de aprendizaje para poder usar correctamente y con soltura un framework necesita de un esfuerzo, mucho más si llevamos años programando sin usarlo. Symfony dispone de guias y manuales en abundancia, y además cuenta con numerosos foros en varios idiomas donde la comundad va resolviendo dudas. En el caso de Zend, a pesar de ser el framework de la empresa que está detrás de PHP, la comunidad es algo escasa, por tanto su documentación también.

Pruebas unitarias. Symfony dispone de tareas por linea de comandos para realizar testing, y además genera una clase vacia con cada nuevo controdalor desde el que poder realizar las pruebas. Zend no dispone de esta funcionalidad, algo que me parece muy importante a la hora de lanzar una aplicación a un entorno de producción.

Plantillas y plugins. Al sistema de plantillas de Zend le queda todavía un largo camino que recorer, mientras que en Symfony el sistema está ya muy avanzado, con la posibilidad de agragar módulos. Y otro tanto ocurre con los plugins, en Symfony es posible aumentar sus funcionalidades a base de plugins, mientras que Zend carece de esta característica.

Bases de datos. El trabajo con base de datos en Zend se limita a usar ActiveRecord (que no digo que esté mal), pero en Symfony tienes la posibilidad de usar el motor de base de datos que quieras, incluyendo el propio Zend_Db, algo que aporta una enorme flexibilidad al desarrollador que puede elegir en cada proyecto cual es la mejor opción.

Como conclusión a lo dicho quiero añadir, para todos aquellos que quieran dar el salto a hacer desarrollos basados en un framework, que a pesar de que al principio pueda resultar un poco engorroso con el tiempo os ayudará a mantener una limpieza de código y un mantenimiento de aplicaciones mucho más sencillo.

Preparando la Certificación de PHP

Desde hace unos meses estoy preparando la certificación de PHP, y ahora que se acerca el examen, me he propuesto dedicarle más horas. A cada nuevo capí­tulo que avanzo sobre el temario me doy cuenta de una cosa, para aprobar la certificación hay que saber las cosas al dedillo, no basta con saber programar.

Para los que no sepais de que va la Zend Certified Engineer (ZCE), podeis echar un vistazo en la página oficial de Zend. El examen consta de 70 preguntas y tienes 90 minutos para responderlas. Según me han comentado hace falta el tiempo, es mejor no pararse demasiado a pensar si no sabes la respuesta. Haciendo numeros sale a poco más de 1 minuto 28 segundos por pregunta.

El temario consta de 12 bloques temáticos: PHP Básico, Funciones, Arrays, Programación Orientada a Objetos, Seguridad, XML y Servicios Web, Cadenas y Modelos, Bases de Datos y SQL, Caracteristicas Web, Diferencias entre PHP4 y PHP5, Clases y Diseño y Teoria de Programación.

No se si el examen será tan duro como lo pinta el temario, pero desde luego pinta muy negro. Por mi parte pienso dedicarle bastantes horas estas dos semanas a prepararlo, después de pagar las taxas del examen no tengo ganas de suspender.