Dado que las explicaciones sobre la pregunta a la que se ha vinculado son bastante extensas, no volveré a redefinirla para usted. En cambio, intentaré mostrarle mediante un ejemplo de inyección.
class Logger {
private $__logger;
public function __construct($logger) {
$class = $logger . "Logger";
$this->$__logger = new $class();
}
public function write($message) {
$this->$__logger->write($message);
}
}
Así que, por encima de usted tiene una clase Logger
que puede que esté utilizando para registrar información en alguna parte. Realmente no nos importa cómo lo hace, solo sabemos que lo hace.
Ahora, tenemos un par de diferentes posibilidades de registro ...
class DBLogger {
public function write($message) {
// Connect to the database and
// INSERT $message
}
}
class FileLogger {
public function write($message) {
// open a file and
// fwrite $message
}
}
class EMailLogger {
public function write($message) {
// open an smtp connection and
// send $message
}
}
Ahora, cuando usamos nuestra registrador, que hacerlo mediante cualquiera de los siguientes:
$logger = new Logger("DB");
$logger = new Logger("EMail");
$logger = new Logger("File");
Nosotros siempre interactúe con $logger
de la misma manera (es decir, llamamos al write($message)
). La instancia de contenedor Logger
envuelve la clase de registro real y llama a sus métodos en nuestro nombre.
Un uso más común del tipo de código anterior sería cuando use archivos de configuración para determinar qué es su registrador. Por ejemplo, considere el caso en el que desea que su registro se envíe a un archivo.Es posible que tenga una configuración que se parece a esto:
$logging = array(
'type' => 'file',
'types' => array(
'file' => array(
'path' => '/var/log'
'name' => 'app_errors.log'
),
'email' => array(
'to' => '[email protected]',
'from' => '[email protected]',
'subject' => 'Major fail sauce'
),
'db' => array(
'table' => 'errors',
'field' => 'error_message'
)
)
);
Y sus clases adaptadas podría ser:
class FileLogger {
public function __construct() {
// we assume the following line returns the config above.
$this->config = Config::get_config("logger");
}
public function write($message) {
$fh = fopen($this->config->path . '/' . $this->config->file);
fwrite($fh, $message . "\n");
fclose($fh);
}
}
Nos gustaría hacer lo mismo para las otras clases adapted
. Luego, con una pequeña modificación en el Wrapper principal Logger
, podríamos crear la instancia envuelta correcta utilizando los datos de configuración y basarla en el type
que se define en la configuración. Una vez que tenga algo así en su lugar, cambiar al registro por correo electrónico es tan fácil como cambiar el type
en la configuración.
¡Buen ejemplo! ... –
¡Muchas gracias! Ahora entiendo oficialmente el concepto. Aunque, no me malinterpretes. Cuantos más ejemplos pueda ver, mejor será mi comprensión. Gracias por tomarse el tiempo para escribir ese ejemplo. Es muy apreciado y espero que otros encuentren su camino hacia su respuesta. – darga33
@sberry ¿Puede la herencia de uso de clase de envoltura? – user1448031