2012-02-21 89 views
9

Leo this entire post. Describe qué es una clase de contenedor para otros programadores experimentados, pero no para un novato como yo.Necesito una explicación de una clase contenedora con un ejemplo que un niño pueda entender

Entiendo la sintaxis de PHP, el concepto orientado a objetos, pero todavía no he escrito mi propia aplicación en código orientado a objetos. Estoy más allá de confundirme cuando trato de averiguar qué es exactamente una clase contenedora. No entiendo la jerga técnica.

Espero que alguien responda con una hermosa descripción infantil detallada que sea fácil de entender para alguien que entienda los conceptos básicos del programa orientado a objetos y haya leído casi toda la referencia del lenguaje php.net, pero no tiene ningún objeto real experiencia de programación orientada. No hay aplicaciones escritas aún

Respuesta

14

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.

+1

¡Buen ejemplo! ... –

+0

¡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

+0

@sberry ¿Puede la herencia de uso de clase de envoltura? – user1448031

2

Las clases de envoltorio solo hacen que su clase infantil sea más fácil de usar para una circunstancia particular. Muchas bibliotecas están escritas para cubrir una amplia variedad de situaciones y, por lo tanto, resultan engorrosas y complejas de usar. Muchos proyectos crearán envoltorios para la biblioteca para que sea más fácil de usar.

Tome este uso DOP clase, por ejemplo:

$sth = $dbh->prepare('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < :calories AND colour = :colour'); 
$sth->bindParam(':calories', $calories, PDO::PARAM_INT); 
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); 
$sth->execute(); 

No se preocupe demasiado por los detalles. Solo sepa que estas líneas de código consultan una base de datos. Una clase de contenedor permite la misma funcionalidad superior con algo como:

Db::query('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < :calories AND colour = :colour', 
    array($calories, $colour)); 

Hemos eliminado algunas de las características engorrosos, pero rara vez utilizadas, de la clase de niño en una interfaz fácil de usar. Internamente, la clase contenedora está creando el mismo tipo de llamadas a PDO, pero eso es oculto del desarrollador.

Descargo de responsabilidad: Los ejemplos son solo eso .. ejemplos. No pretende mostrar mejores prácticas o incluso ser práctico.

+1

IE Algunas veces, la "facilidad de uso" nunca se le ocurrió a los autores del código original, por lo que algunas veces alguien más tiene que venir y hacer una clase contenedora para hacerlo posible. Editar para ser más justo: a veces los autores del código original no se daban cuenta de las plataformas o propósitos adicionales en los que se usaría su código. –

+0

Mike! ¡La misma respuesta para usted que para sberry! ¡Muchas gracias! Ahora puedo entender un poco sobre para qué se usa. ¡Ojalá hubiera alguna forma de vincular esta publicación al enlace en la publicación original para que otros también puedan beneficiarse de ella! – darga33

Cuestiones relacionadas