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...

11 Responses

  1. Albert Casademont says:

    Ja només ens falta el “new Hola->wea();”

  2. Andrés says:

    Gracias por esta descripción de las novedades de PHP 5.4 .
    Esperemos que los hostings se den cuenta y actualicen a PHP 5.4 cuando antes (o como mínimo a PHP 5.2).

    Hay cosas muy interesantes y útiles que quisiera utilizar ya en mis desarrollos .
    Saludos

  3. Toño says:

    Hola Ricard, enhorabuena por tu blog.

    Al grano.. Lo que realmente echo de menos en este alpha es tener la posibilidad de forzar el tipo de retorno. Y mira que lleva casi 2 años la propuesta https://wiki.php.net/rfc/returntypehint

    Un saludo desde Copenhague.

  4. Ricard Clau says:

    @Albert: Totalment d’acord

    @Andrés: Es muy útil todo lo de 5.4 pero me temo que para que esté en los hostings mínimo un par de años 🙁

    @Toño: Señor! Cuánto tiempo!

    Lo del Return Type Hinting no sé e? Te jodería los métodos factory y demás… aunque si es que puedas poner el interface o la clase parent, entonces sí, sin duda.

    Con PHPDoc engañas al IDE pero estaría bien ser riguroso.

    ¿Todo bien por Copenhague?

  5. Toño says:

    Por aquí tirando.. ya he montado mi grupo local y poco a poco cada vez aparece más gente.. pero me tienen de Drupal hasta las narices..

    Creo que en los factories sería donde la cosa luciría mucho más, obligando a devolver un interface o cierto tipo. Pero donde más lo echo de menos es a la hora de definir métodos abstractos o interfaces.
    Me paso el día rodeado de gente que trabaja con C# y hay cosas que se pegan.

    Por cierto.. me dejaste con la boca abierta con alguna de las soluciones del concurso de Tuenti. Sobre todo con los grafos. Enhorabuena.

  6. Ricard Clau says:

    Drupal sigue teniendo un montón de fans, nunca lo he usado a fondo pero no lo acabo de entender. Hace poco hice entrevistas en un sitio pero me echó para atrás el tema Drupal.

    Los grafos de Bellman-Ford los cogí ya hechos e? Ya especifico en algunos sitios lo que cogí prestado :), otras sí que son self-made.

    Al final quedé el 71 y había bastantes pocos con PHP.

    • Toño says:

      Qué si tiene fans? El año pasado fue aquí la DrupalCon y parecía un concierto de Justin Bieber.. hasta con camisetas, chapas, pegatinas y accesorios con el logo..

      Prestados o home-made.. me encantaron..
      ¿El 71 en el general o sólo entre PHP? Sea donde sea es un número como para quitarse el sombrero..

  7. Excelente el artículo Ricard. Siempre esperando buenos artículos tuyos

  8. Ricard Clau says:

    @Juan: Gracias!

    @Toño: Quedé el 71 en total. Puedes verlo en Tuenti Contest Stats hacia el final sale un Ricard C. P. sospechoso 😉

    En cuanto a PHP, sacaron una gráfica en Tuenti Developers Blog donde poquita gente usó PHP… así que de PHP… de los 10-15 mejores 😉

  9. Jaume says:

    El type hinting es una característica que puedes o no usar. No tiene que ver con las funciones de PHP. Puedes definir una función como:

    <?php
    function foo ($bar) {
    }

    Como:

    <?php
    function foo (array $bar) {}

    La segunda lanzará un E_RECOVERABLE_ERROR si $bar no es un array, pero es una característica que no te afecta, si no vas a usarla.

  1. 02/07/2011

    […] compañero Ricard Clau y yo hemos estado haciendo algunas pruebas con esta versión y aquí os presentamos algunas de las […]

Leave a Reply

Your email address will not be published. Required fields are marked *