PHP 5.4 – El espectáculo continúa

Muchos todavía estamos descubriendo las bondades de PHP5.3 y sus novedades y aún hay muchos sitios importantes que corren sobre PHP5.2. Sin embargo, el equipo que hace PHP no descansa y recientemente han publicado la primera versión alpha de lo que será PHP5.4 que promete muchas mejoras tanto en rendimiento como en funcionalidades.

Mi compañero Christian Soronellas y yo hemos estado haciendo algunas pruebas con esta versión y aquí os presentamos algunas de las novedades que consideramos más destacadas.

Traits

Probablemente el plato estrella de la versión. Un trait viene a ser algo así como un trozo de clase que podemos importar en varios sitios. Además, en una clase hija, podemos heredar de varios traits. Y con esto, en parte, conseguimos la tan deseada por algunos herencia múltiple en cierta manera.

<?php
trait Singleton
{
  private static $_instance;
  private function __construct(){}
 
  public function __clone()
  {
    throw new Exception('This object cannot be cloned!');
  }
 
  public static function getInstance()
  {
    if (null === static::$_instance) {
      static::$_instance = new static();
    }
    return static::$_instance;
  }
}
 
class Product
{
  use Singleton;
}
 
$product = Product::getInstance();
?>

Más fácil aún hacer Singletons y sobretodo, centralizado el código de instanciación.

Podéis ver algunos ejemplos más con, por ejemplo, tratamiento de colisiones al hacer el use de varios traits con funciones idénticas y algunos otros ejemplos en esta web..

Array deferencing

Esto es algo bastante molón que hasta ahora no se podía hacer. Cuántas veces habéis tenido que llamar a una función que devuelve un array y al tener que tratar su resultado habéis pensado: Qué bien me iría poder poner corchetes al resultado de la función directamente. Pues eso por fin se puede hacer:

<?php
echo call_user_func(function(){return array('test', 'deferencing');})[1];
?>

Aquí veríamos un ‘deferencing’ en consola. Muy a lo JavaScript.

DTrace

El DTrace es un sistema de debug de aplicaciones en tiempo real en entornos de producción. Usa scripts en “D” para debuggar partes de la aplicación al alcanzar ciertas condiciones (qué X archivo se ha abierto, qué Y linea se ha alcanzado, etc. ) y así aportar visibilidad en entornos de producción. Lejos ha quedado aquel tiempo en que las webs eran solamente una sección de noticias y un triste catálogo. Y a veces, tenemos aplicaciones monstruosas donde es complicado ver la secuencia de llamadas. Seguro que esto ayuda a encontrar errores en nuestra aplicación.

Mejoras en memoria y rendimiento de Zend Engine

Este punto es súper importante que no se descuide nunca. Bien es cierto que con los cacheos (HTTP_Cache, CDNs varios, Memcached, etc…) con APC para Opcode Cache y el resto de técnicas de high-performance se optimiza mucho. Pero al final, optimizando el core de PHP se ganará muchísimo ya que por la naturaleza de PHP, cada Request vuelve a empezar todo y el proceso de bootstraping debe ir lo más rápido posible.

Paso a PECL de la extensión de SQLite

Cada vez se usa más SQLite, para testear la BBDD, para entornos de desarrollo locales y es importante tener claro cómo trabajar con ella y cómo instalar la extensión para PHP.

Rotura con algunas miserias del pasado

Desaparecen por fin settings de tan infausto recuerdo como safe_mode, register_globals (cuánto daño ha hecho), register_long_arrays, allow_call_time_pass_reference,…

También desaparecen las siguientes funciones relacionadas con el tratamiento de sesiones: session_is_registered(), session_register() and session_unregister()

Además, el tema del break y el continue, queda de la siguiente manera: podemos hacer break y continue para salir de un bucle, break 2 o continue 3 para saltarnos varias iteraciones pero no podemos hacer un break $i. Nos dará un error de algo así como Expected Constant Value. Realmente no sé qué utilidad puede tener la variable ahí pero… 🙂

<?php
  public function testBreakI()
  {
    $z = 2;
    for($i = 0; $i < 10; $i++)
      for($j = 0; $j < 10; $j++)
        if ($i == 2 && $j == 2)
          break $z;
 
    var_dump($i, $j);
  }
  testBreakI();
?>

Y en php.ini, el default encoding es UTF-8 (gracias señor), el short tag de template <?= estará habilitado siempre (sorpresa) y algunas cositas más que podéis ver en PHP.net.

Pensamientos finales

Parece que el desarrollo de PHP no solamente no para sino que cada vez se está convirtiendo en un lenguaje más serio. Prueba de ello es que cada vez más empresas están utilizando PHP y los buenos desarrolladores de este lenguaje escasean y cada vez están mejor valorados, por tanto alegría para todos.

Queda por ver qué pasará con el scalar type hinting. A mí no me gusta porque en web siempre TODO llega como tipo String y es un auténtico coñazo estar todo el rato convirtiendo el tipo de variable. Justamente esto fue lo que me hizo decidir por PHP respecto a JSP, espero que nunca cambie.

Pero en la comunidad PHP sigue habiendo aquella vieja cultura de “yo sé más que este flipao del framework XXX”, “ya me lo hago yo de 0”, etc… que nos hace parecer amateurs respecto a otros lenguajes donde todos van a una. Tenemos que mejorar esto.

Recientemente hubo un hilo en Twitter llamado #phpneeds. PHP necesita unificación de frameworks, sin duda.

You may also like...