Pregunta

El código base que he sido entregado a la obra con las características de una clase que hereda de DATABSE MDB2 . Esto constituye la base para el marco de MVC en uso (un asunto hecha a la medida) y los modelos a su vez hereda de db.

Como estoy seguro de que algunos de ustedes han notado, esto lleva a un lugar gran problema. Cada vez que se ejemplariza un modelo, el resultado es una nueva conexión de base de datos que se está creando. Esto es obviamente muy derrochador. También significa que soy incapaz de utilizar las transacciones como se pretende, porque si una transacción se inicia en un caso de un modelo, sus efectos son invisibles para los otros casos hasta un commit ocurre.

Mi plan es cambiar la clase db a MDB2 encapsulado en lugar de heredar de ella, y luego tener que mantener una única instancia de MDB2 a través de su funcionalidad Singleton.

Sin embargo, MDB2 es una gran biblioteca con una gran cantidad de métodos, y muchas cosas más arriba en la base de código depende de la capacidad de los métodos de acceso MDB2.

¿Hay una forma de encapsular la clase MDB2 y pasar llamadas a la misma sin modificar las capas superiores, y sin tener que escribir un método de envoltura para cada método en el MDB2?

¿Fue útil?

Solución

Dado que usted no proporcionó ningún código sin embargo, esto es una sugerencia ciega cómo se puede eliminar la herencia con muy poco código, mientras que al mismo tiempo, mantener la funcionalidad completa y asegurarse de que la clase sólo MDB se crea una instancia de una vez.

class Db
{
    protected static $_mdb;
    public function __construct()
    {
        if(self::_mdb === NULL) {
            self::_mdb = new MDB;
        }
    }
    public function __call($method, $args)
    {
        return call_user_func_array(array(self::_mdb, $method), $args);
    }
}

Esto básicamente hará que su clase DB un decorador de MDB. En la primera de instancias, la clase DB va a crear y almacenar una instancia estática de MDB. Esta será compartido entre todas las instancias de base de datos, incluyendo las clases hijas. No hay ninguna razón para utilizar un Singleton aquí.

El interceptor __call se asegurará de que cualquier método que os llamó por DB que los métodos de compra sobre el método MDB serán capturados y delegadas a la instancia MDB. métodos mágicos pueden tener un grave impacto en el rendimiento, por lo que cuando se observa cualquier impacto en el rendimiento, añadir cualquiera de los métodos llamados a la clase DB y delegado de allí.

Ni que decir tiene, esto todavía no es la mejor solución, porque su DB de instancia se sigue estrechamente unida a las clases del modelo. Si usted puede permitirse más refactorización, sugeriría para hacer todas las clases que actualmente heredan de DB encapsulan el DB de instancia en su lugar (a menos que sean ActiveRecords). A continuación, utilice la inyección de dependencias para hacer que el DB de instancia disponibles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top