简而言之,Class是对象的蓝图。对象在应用程序中封装了概念上相关的状态和责任,并且通常提供与之交互的编程接口。这促进了代码重用并提高了可维护性。
想象一下锁: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;
}}
现在忽略namespace,private并public宣布。
Lock类是应用程序中所有Locks的蓝图。锁可以被锁定或解锁,由财产 代表$isLocked。由于它只能有这两种状态,我使用布尔(true或false)来表示适用的状态。我可以通过它的方法 lock与Lock进行交互unlock,这将相应地改变状态。该isLocked方法将为我提供Lock的当前状态。现在,当您从此蓝图创建一个对象(通常也称为实例)时,它将封装唯一的状态,例如$aLock = new Lock; // Create object from the class blueprint$aLock->unlock(); // You unlocked the Lock$aLock->lock(); // You locked the Lock
让我们创建另一个锁,同时封装它自己的状态$anotherLock = new Lock;$anotherLock->unlock(); // You unlocked the Lock
但是因为每个对象/实例都封装了它自己的状态,所以第一个锁保持锁定状态var_dump( $aLock->isLocked() ); // gives Boolean truevar_dump( $anotherLock->isLocked() ); // gives Boolean false
现在,锁定或解锁锁定的整个可靠性都是在Lock类中完成的。每次想要锁定某些东西时都不必重建它,如果你想改变Lock的工作方式,你可以在Lock的蓝图中改变它,而不是所有具有 Lock 的类,例如一个门: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;
}
}}
现在,当您创建Door对象时,可以为其指定一个Lock对象。由于Lock对象处理锁定或解锁某些东西的所有责任,因此Door不必关心这一点。实际上,任何可以使用Lock的对象都不必关心,例如胸部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;
}
}}
如您所见,胸部的可靠性与门的不同。胸部包含战利品,而门则将房间隔开。您可以将锁定或解锁状态编码到两个类中,但是使用单独的Lock类,您不必重复使用Lock。$doorLock = new Lock;$myDoor = new Door($doorLock);$chestLock = new Lock;$myChest new Chest($chestLock);
胸部和门现在有他们独特的锁。如果锁是一个可以同时存在于多个地方的魔法锁,就像在量子物理中一样,你可以为胸部和门分配相同的锁,例如$quantumLock = new Lock;$myDoor = new Door($quantumLock);$myChest new Chest($quantumLock);
当你unlock()的$quantumLock,无论是门和胸部将被解锁。
虽然我承认量子锁是一个不好的例子,但它说明了共享对象的概念,而不是在整个地方重建状态和责任。一个真实世界的示例可以是您使用数据库传递给类的数据库对象。
请注意,上面的示例没有显示如何进入Lock of a Chest或Door以使用lock()和unlock()方法。我将此作为练习让您锻炼(或其他人添加)。
还要检查何时使用self超过$ this?有关类和对象的更深入解释以及如何使用它们
对于一些额外的资源检查