2010-02-05 22 views

Respuesta

193

En pocas palabras, una clase es un modelo para un objeto. Y un objeto encapsula el estado y la responsabilidad relacionados conceptualmente de algo en su aplicación y generalmente ofrece una interfaz de programación con la que interactuar con ellos. Esto fomenta la reutilización del código y mejora el mantenimiento.


imaginar un bloqueo:

namespace MyExample; 

class Lock 
{ 
    private $isLocked = false; 

    public function unlock() 
    { 
     $this->isLocked = false; 
     echo 'You unlocked the Lock'; 
    } 
    public function lock() 
    { 
     $this->isLocked = true; 
     echo 'You locked the Lock'; 
    } 
    public function isLocked() 
    { 
     return $this->isLocked; 
    } 
} 

ignorar la declaración namespace, private y public en este momento.

La clase de bloqueo es un plan para todos los bloqueos en su aplicación. Un bloqueo puede ser bloqueado o desbloqueado, representado por la propiedad $isLocked. Como solo puede tener estos dos estados, utilizo un booleano (true o false) para indicar qué estado se aplica. Puedo interactuar con el bloqueo a través de los métodos lock y unlock, que cambiarán el estado en consecuencia. El método isLocked me dará el estado actual del bloqueo. Ahora, cuando crea un objeto (también conocido como instancia) de este modelo, encapsulará un estado único, p.

$aLock = new Lock; // Create object from the class blueprint 
$aLock->unlock(); // You unlocked the Lock 
$aLock->lock(); // You locked the Lock 

Vamos a crear otra cerradura, también encapsular su propio estado

$anotherLock = new Lock; 
$anotherLock->unlock(); // You unlocked the Lock 

sino porque cada objeto/instancia encapsula su propio estado, la primera cerradura permanece bloqueada

var_dump($aLock->isLocked());  // gives Boolean true 
var_dump($anotherLock->isLocked()); // gives Boolean false 

Ahora, la totalidad la responsabilidad de mantener un candado bloqueado o desbloqueado se encasilla dentro de la clase de candado. No tiene que reconstruirlo cada vez que desea bloquear algo y si desea cambiar cómo funciona un bloqueo, puede cambiar esto en el plano de Bloqueo en lugar de todas las clases que tienen un candado, p. a Puerta:

class Door 
{ 
    private $lock; 
    private $connectsTo; 

    public function __construct(Lock $lock) 
    { 
     $this->lock = $lock; 
     $this->connectsTo = 'bedroom'; 
    } 
    public function open() 
    { 
     if($this->lock->isLocked()) { 
      echo 'Cannot open Door. It is locked.'; 
     } else { 
      echo 'You opened the Door connecting to: ', $this->connectsTo; 
     } 
    } 
} 

Ahora, cuando crea un objeto Puerta, puede asignarle un objeto Bloquear. Como el objeto Lock maneja toda la responsabilidad de si algo está bloqueado o desbloqueado, la puerta no tiene que preocuparse por esto. De hecho todos los objetos que pueden utilizar un bloqueo no tendrían que cuidar, por ejemplo, un pecho

class Chest 
{ 
    private $lock; 
    private $loot; 

    public function __construct(Lock $lock) 
    { 
     $this->lock = $lock; 
     $this->loot = 'Tons of Pieces of Eight'; 
    } 
    public function getLoot() 
    { 
     if($this->lock->isLocked()) { 
      echo 'Cannot get Loot. The chest is locked.'; 
     } else { 
      echo 'You looted the chest and got:', $this->loot; 
     } 
    } 
} 

Como se puede ver, el reponsibility del pecho es diferente de la de una puerta. Un cofre contiene botín, mientras que una puerta separa las habitaciones. Puede codificar el estado bloqueado o desbloqueado en ambas clases, pero con una clase de bloqueo separada, no es necesario y puede reutilizar el bloqueo.

$doorLock = new Lock; 
$myDoor = new Door($doorLock); 

$chestLock = new Lock; 
$myChest new Chest($chestLock); 

Pecho y puerta ahora tienen sus exclusivas cerraduras. Si el bloqueo era un bloqueo mágico que puede existir en varios lugares al mismo tiempo, como en la física cuántica, podría asignar el mismo bloqueo tanto al cofre como a la puerta, p.

$quantumLock = new Lock; 
$myDoor = new Door($quantumLock); 
$myChest new Chest($quantumLock); 

y cuando unlock() la $quantumLock, tanto de la puerta y en el pecho sería desbloqueado.

Aunque admito que las cerraduras cuánticas son un mal ejemplo, ilustra el concepto de compartir objetos en lugar de reconstruir el estado y la responsabilidad en todas partes. Un ejemplo del mundo real podría ser un objeto de base de datos que pase a las clases usando la base de datos.

Tenga en cuenta que los ejemplos anteriores no muestran cómo llegar a la cerradura de un cofre o una puerta para utilizar los métodos lock() y unlock(). Dejo esto como un ejercicio para que te ejercites (o que alguien más lo agregue).

También puedes ver When to use self over $this? para una explicación más a fondo de las clases y los objetos y cómo trabajar con ellos

Para algunos recursos adicionales comprobar

11

sé que solicitó un recurso, no una explicación, pero aquí hay algo por lo que he entendido implementación básica de las clases:

Imagínese la clase como una plantilla de la construcción. Un boceto básico de cómo debe verse un edificio. Cuando va a construirlo realmente, cambia algunas cosas para que parezca que su cliente quiere (propiedades en caso de clase). Ahora debe diseñar cómo se comportarán las cosas dentro del edificio (métodos). Voy a mostrarlo en un simple ejemplo.

clase de edificio:

/** 
* Constructs a building. 
*/ 
class Building 
{ 
    private $name; 
    private $height; 


    public function __construct($name, $height) 
    { 
     $this->name = $name; 
     $this->height = $height; 
    } 

    /** 
    * Returns name of building. 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 


    public function elevatorUp() 
    { 
     // Implementation 
    } 


    public function elevatorDown() 
    { 
     // Implementation 
    } 


    public function lockDoor() 
    { 
     // Implementation 
    } 
} 

llamar a la clase:

// Empire State Building 
$empireStateBuilding = new Building("Empire State Building", 381); 

echo $empireStateBuilding->getName(); 
$empireStateBuilding->lockDoor(); 


// Burj Khalifa 
$burjKhalifa = new Building("Burj Khalifa", 828); 

echo $burjKhalifa->getName(); 
$burjKhalifa->lockDoor(); 

Sólo copiarlo, ejecutarlo en su servidor local y tratar de hacer algunos cambios. En caso de cualquier pregunta, solo pregúntame. Si no encuentra esto útil, solo use los enlaces de los carteles anteriores, estos son tutoriales bastante sólidos.

2

para ofrecer una vista desde otro ángulo si se puede complacer (basado en la experiencia personal). Necesita sentir "la necesidad de OOP" antes de poder entender realmente de qué se trata. En mi humilde opinión, los recursos de aprendizaje deberían venir después de esto.

Uno básicamente "necesita" estar atascado en dificultades estructurales al escribir un programa relativamente grande escrito en estilo de procedimiento (en lugar de Orientado a Objetos, perdón si alguien está en desacuerdo con el término). Para entonces, él/ella podría tratar de reestructurar el código en objetos para organizarlo mejor y, naturalmente, aprender más sobre OOP en detalle. Una vez más, esta es mi experiencia personal y me ayudó a comprender más rápido que cualquier libro.

Sólo mis dos centavos.