Novedades PHP 5.3 (II) – Algunas cosas útiles o curiosas

Seguimos con los posts sobre PHP 5.3 y sus novedades, a veces desconocidas o poco publicitadas.

En esta ocasión voy a comentar algunas pequeñas cosas que quizás han pasado desapercibidas por la mayoría de vosotros pero que creo que pueden tener cierta utilidad en nuestros proyectos.

E_DEPRECATED

Si has puesto PHP 5.3 en tu equipo y ejecutas algún proyecto realizado hace más de 2 o 3 años es muy probable que te hayan saltado avisos de funciones deprecadas en 5.3 y que desaparecerán antes o después del lenguaje. Quizás lo más destacable sean las funciones ereg_*, que se usaban un montón y deben ser sustituidas por las preg_* que usan expresiones regulares de PERL (más rápidas que las POSIX). Si usáis la mítica clase fpdf, veréis que peta por todas partes. Lo mismo pasa con funciones como split, mimetype, etc… que hay que ir sustituyendo por nuevas opciones, en general más completas y rápidas.

Estos avisos han provocado un rechazo inicial a PHP5.3, tildándolo de inestable cuando en realidad, nos está avisando de que algo estamos haciendo mal.

En cualquier caso, para aquellos métodos donde necesitemos ejecutar clases antiguas como fpdf, de momento podemos ejecutar error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);

¿Alguien se anima a rehacer la clase fpdf en PHP5.3? Seguro que se hace famosillo!

Magic constant __DIR__

Esto no es un gran avance ni salvará al mundo de la destrucción pero muchas veces nos interesa saber el directorio exacto donde está nuestro archivo PHP. Puede parecer una tontería, pero cuando subimos nuestros proyectos a servidores compartidos, vaya usted a saber la ruta exacta a donde apunta nuestra cuenta FTP.
También podemos hardcodearlo pero… ay el día que vayamos a migrar o cambiar de entorno.

Hasta PHP 5.2 podíamos aprovecharnos de la constante __FILE__ y pasarlo por la función dirname. En PHP 5.3, existe la constante __DIR__ que nos da el directorio donde estamos.

<?php
   // Ejemplo en mi Ubuntu Local
   // Ponemos el archivo en /var/www/proyecto/testfile.php
   echo __FILE__; // ->  /var/www/proyecto/testfile.php
   // A la vieja usanza
   echo dirname(__FILE__); // -> /var/www/proyecto
   // PHP 5.3, equivalente a lo anterior;
   echo __DIR__; // -> /var/www/proyecto
?>

Podéis ver más sobre las Magic Constants en http://php.net/manual/en/language.constants.predefined.php

Configuración de php.ini específica por proyecto

Me sé de más de uno que cuando sepa que se puede hacer esto se tirará de los pelos.
Muchas veces estamos desarrollando o manteniendo proyectos con diferente antigüedad y por los cuales ha pasado gente válida y algún que otro manazas.

No hace tanto, lo normal era no tener en cuenta los E_NOTICE y no digamos ya los problemas del nuevo E_DEPRECATED y eso hace que con la configuración estándar de PHP 5.3, con el error_reporting a E_ALL, sea fácil tener proyectos donde si no desactivamos o rebajamos el nivel de error_reporting, prácticamente ni funcionan debido a la cantidad de errores por pantalla.

Muchos optan por desactivar ese error_reporting en su equipo pero luego pasa lo que pasa, en el proyecto nuevo subimos algo sin tener en cuenta los notices y pam, error en el entorno de producción.

Desde PHP 5.3, se puede hacer lo siguiente en php.ini:

[HOST=proyectonuevo.local]
error_reporting = E_ALL
display_errors = On

[HOST=proyectoviejo.local]
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
display_errors = Off

Con esto tendremos unos settings para el proyectonuevo y otros para el proyectoviejo sin tener que forzar nada en nuestro código. Bastante útil, ¿no os parece? Solo tiene un pero… y es que esto para web muy bien pero para CLI no funciona, así que cuidado con los crons y los procesos batch en general!

Magic method para funciones static no definidas

El magic method es __callStatic y es el equivalente a __call pero para llamadas en modo static

<?php
class testNewCallStatic {
   // Obligatoriamente debe estar definida como public static para funcionar correctamente
   // en $name recibimos el nombre del método inexistente
   // en $args recibimos un array con cada uno de los parámetros
   public static function __callStatic($name, $args) {
     echo 'Llamando a '. $name;
     echo 'Params:';
     var_dump($args);
   }
}
 
testNewCallStatic::prueba1(); // $args es array vacío
testNewCallStatic::prueba2(20); // $args es array(0=>20);
testNewCallStatic::prueba3('string', array(10,20,30)); 
// $args es un array con dos elementos, posicion [0] => 'string', posicion [1] el array pasado
?>

Cuidado con los magic methods, que si bien es cierto que permite hacer cosas interesantes, tienen un rendimiento bastante peor que métodos definidos. Si pretendemos hacer un activeRecord un poco listillo, probablemente sea una buena práctica implementar algunos métodos muy usados y dejar funciones menos utilizadas a través de __call y __callStatic. Veremos ejemplos sobre todo esto en próximos posts.

Y aquí lo dejamos por hoy. Soy consciente de que no he comentado nada de namespaces, closures y anonymous functions, __invoke, objeto DateTime, etc… pero Stay tuned!

You may also like...

2 Responses

  1. Tenshin says:

    Interesantes novedades sobretodo la configuracion php.ini
    . Me ha quedado claro el uso de la constante DIR sobretodo con el ejemplo, yo tambien uso Ubuntu 😀
    Espero que pongas otro post con mas novedades y explicaciones como regalo de reyes, yo me he portado bien jejeje :mrgreen:
    saludos

  2. Ricard Clau says:

    Me alegro que te gusten, y sobretodo que se entienda! jejejeje
    Estos días está un poco parado el blog ya que medio estoy de vacaciones pero 2011 vendrá con muchos posts (espero) interesantes!
    Un abrazo y felices fiestas! 😛