universo tierra teoria sol quien que por pone modelo ideado heliocentrica era dijo copƩrnico centro actualidad php oop dependencies instantiation circular-dependency

php - teoria - quien dijo que la tierra no era el centro del universo



Posible problema de dependencia circular con la aplicaciĆ³n PHP (4)

Estoy experimentando lo que creo que es un problema de dependencia circular con mi aplicación PHP. Por favor, avíseme si esto es incorrecto. Aquí está la situación:

Dos clases, LogManager y DBSession.

DBSession se usa para interactuar con la base de datos y LogManager se usa para iniciar sesión en los archivos. Ambos son ampliamente utilizados en mi aplicación. Cuando crea una instancia de DBSession, debe darle una instancia de LogManager a través de un parámetro de constructor. Esto porque DBSession algunas veces registrará información en un archivo, y usará la instancia LogManager para hacer esto.

Ahora, quería extender LogManager para que también pudiera iniciar sesión en una tabla de base de datos, en lugar de en un archivo de texto. Naturalmente, mi preferencia es reutilizar las clases existentes, pero pronto me di cuenta de que esto producía una situación interesante.

DBSession ya requiere una instancia de LogManager para la construcción. Si deseo volver a utilizar la clase DBSession en LogManager, ahora requerirá una instancia de DBSession. ¿Cómo puedo satisfacer ambas demandas? Claramente, algo debe estar mal con mi enfoque.

¿Cómo sugerirías que arregle esto?

Gracias de antemano, chicos.


¿Por qué exigir un objeto LogManager para la creación de un objeto DbSession, si solo a veces se escribe en los archivos? Cargue perezoso en su lugar solo cuando lo necesite. Además, en mi opinión, ambos deberían ser independientes el uno del otro. Cada uno podría instanciar el otro cuando sea necesario.


Tal vez pueda aplicar algún patrón, como Singleton Pattern, para asegurarse de que solo tiene una instancia de su clase LogManager, por ejemplo.


Uno de estos objetos en realidad no necesita el otro: lo has adivinado, es la DBSession. Modifique ese objeto para que el registrador pueda adjuntarse después de la construcción.


No extienda LogManager, permita que sea un tipo agregado. Y retrasar la elección de dónde desea iniciar sesión, es decir:

$logManager = new LogManager(); $dbSession = new DbSession($logManager); $logManager->add(new FileLog($filename) ); $logManager->add(new DBLog($dbSession) );

Donde, por supuesto, FileLog y DBLog comparten una interfaz común. Esta es una aplicación del patrón Observer, donde add () es la operación "suscribirse", y FileLog / DBLog son los observadores de los eventos de registro. (De esta forma, también podría guardar registros en muchos lugares).

Edición de Owen : ajustada a la sintaxis php.