sql >> Base de Datos >  >> RDS >> Mysql

PDO::FETCH_CLASS con múltiples clases

Como no conoce el tipo (nombre de clase) de los objetos devueltos antes de realizar la consulta, no puede especificarlo.

Sin embargo, podría encapsular esa lógica dentro de otro tipo que use como tipo de retorno que luego puede devolver el tipo de retorno específico:

/**
 * Should not have any private, public or protected members in it's definition.
 * 
 * Does only work for public properties.
 */
class ReturnObject {
    public function getConcrete()
    {
        /* decide here which class */
       $classname = 'Child'; // or 'Adult'

       return $this->selfAs($classname);
    }

    private function selfAs($classname)
    {
        $l = strlen(__CLASS__);
        $s = sprintf('O:%d:"%s"', strlen($classname), $classname).substr(serialize($this), 5+strlen($l)+$l);
        $instance = unserialize($s);
        $instance->__construct();
        return $instance;
    }
}

Luego puede usar el getConcrete() función en cada objeto devuelto para devolver su tipo específico, su lógica de decisión vinculada a la devolución de la base de datos.

Editar: Lo cambié a una versión que primero inicializará las propiedades de los objetos a través de la deserialización (pruebe si esto funciona, se basa en la suposición de que estamos hablando solo de propiedades públicas y no sé si PDO solo hace los setters o más a través de la reflexión en el modo que está usando) y luego llama a la función constructora. El constructor debe ser público (y debe existir) para que esto funcione.

Es técnicamente posible hacer que esto esté disponible también para miembros privados y protegidos, sin embargo, esto necesita una reflexión real y también necesita un análisis de los datos serializados. Esta clase solo cambia el nombre de la clase, pero no dentro de las propiedades privadas.

Sin embargo, esta es sólo una forma de hacerlo. Probablemente solo necesite un ->isChild() o ->isAdult() función en su Person clase.