La pesadilla de siempre: objetos que se pasan por valor por defecto. Te olvidas de poner un triste ampersand (&) al asignar y te pasas horas averiguando por qué el estado de tu instancia se ha perdido.

Ya ha pasado casi un año desde que salió PHP 5 en julio del año pasado. Al principio fui bastante escéptico. Pensaba que la orientación a objetos era algo para los puristas de Java (de hecho, ya hablé de cómo Java 1.4 añadía cosillas interesantes), y que PHP debía seguir siendo ese lenguaje rápido para hacer scripts procedimentales. Pero hoy por fin me he armado de valor, he descargado la versión 5.0.4 y he configurado el módulo en mi Apache local para trastear un poco.

El salto que ha dado el lenguaje con el nuevo motor Zend Engine II es abismal.

El fin del código espagueti y el ampersand maldito

Si habéis picado código en PHP 4, sabéis que la programación orientada a objetos (POO) era un añadido puesto con cinta americana. Las clases eran básicamente arrays asociativos glorificados. Todo era público. Si querías que una propiedad fuera "privada", la llamabas $_variable cruzando los dedos para que nadie la modificara desde fuera.

Con PHP 5, la POO empieza a madurar de verdad. El cambio más salvaje, y el que más me alivia, es que ahora los objetos se pasan por referencia por defecto. Se acabaron las copias accidentales de objetos enteros en memoria. Además, por fin tenemos un modelo de visibilidad real con public, private y protected.

También se ha estandarizado la forma de iniciar y destruir objetos con __construct y __destruct, dejando atrás la costumbre de nombrar al constructor igual que la clase. Y lo mejor: han metido excepciones nativas con try/catch. Adiós a llenar el código de comprobaciones tipo if (!$resultado) { return false; }.

Un ejemplo práctico con mysqli

Para llevar esto en algo útil, me he puesto a reescribir una pequeña clase para gestionar los datos de mis foros. Además del nuevo modelo de objetos, PHP 5 trae la extensión mysqli (MySQL Improved), que permite interactuar con la base de datos directamente usando objetos en lugar del clásico mysql_connect.

Mirad cómo queda el código ahora. Es mucho más limpio y robusto:

<?php
class GestorForo {
    private $db;

    public function __construct() {
        // La nueva maravilla: mysqli orientado a objetos
        $this->db = new mysqli('localhost', 'root', '1234', 'mi_proyecto');

        if (mysqli_connect_error()) {
            throw new Exception("Error de conexión a MySQL: " . mysqli_connect_error());
        }
    }

    public function obtenerFirma($usuario_id) {
        $id_seguro = (int)$usuario_id;

        // Consultas directas sin ensuciar el código global
        $resultado = $this->db->query("SELECT firma FROM usuarios WHERE id = $id_seguro");

        if (!$resultado) {
            throw new Exception("Fallo en la consulta SQL");
        }

        $fila = $resultado->fetch_assoc();
        $resultado->close();

        return $fila['firma'];
    }

    public function __destruct() {
        // Limpiamos la conexión al destruir el objeto
        $this->db->close();
    }
}

// Probando el invento con manejo de errores real
try {
    $gestor = new GestorForo();
    echo "<p>Firma del usuario: " . $gestor->obtenerFirma(1337) . "</p>";
} catch (Exception $e) {
    die("Se ha liado parda: " . $e->getMessage());
}
?>

En este simple bloque, defino mis variables privadas para que la conexión no quede expuesta, lanzo una excepción si falla la conexión o la consulta y, automáticamente, el destructor cierra la sesión de MySQL cuando el script termina su ejecución. Es brillante.

Lo que nos espera

Ver este código funcionando a la primera me da bastante esperanza. Hasta ahora, hacer algo moderadamente complejo en PHP requería mucha disciplina para no acabar montando un caos procedimental. Con esta nueva base, el lenguaje parece listo para sostener proyectos mucho más grandes y serios.

El único problema real que veo a corto plazo es la adopción. La mayoría de los hostings compartidos baratos que uso siguen anclados en PHP 4.3. Tardaremos bastante en poder desplegar este código en producción libremente sin tener que pagar un servidor dedicado carísimo.

Pero el camino está trazado y el futuro pinta muy bien para los que nos gusta picar webs. Ahora me voy a la cama, que el café ya no hace efecto.