我从一本书中了解PHP类时遇到严重问题。他们似乎很难。它们的目的是什么?它们如何工作?
简而言之 ,类是对象的蓝图。对象封装了应用程序中某些内容在概念上相关的状态和责任,并且通常提供与之交互的编程接口。这促进了代码重用并提高了可维护性。
想象一个锁:
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现在的声明。
namespace
private
public
Lock类是应用程序中所有Lock的蓝图。锁可以被 锁定 或 解锁 ,由 属性 表示$isLocked。由于它只能具有这两种状态,因此我使用布尔值(true或false)指示应用哪个状态。我可以通过Lock 和 方法 lock与Lock进行交互unlock,这将相应地更改状态。该isLocked方法将给我锁的当前状态。现在,当您从该蓝图创建对象(通常也称为 instance )时,它将封装唯一状态,例如
$isLocked
true
false
lock
unlock
isLocked
$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 true var_dump( $anotherLock->isLocked() ); // gives Boolean false
现在,在Lock类中包含了保持Lock处于锁定状态或解锁状态的全部责任。您不必每次都想锁定某个东西时就重新构建它,并且如果您想更改锁的工作方式,可以在Lock的蓝图中更改它,而不是更改所有 具有 Lock 的类,例如Door:
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; } } }
现在,当您创建“门”对象时,可以为其分配“锁定”对象。由于“锁定”对象负责处理某些事情,无论是锁定还是未锁定,因此“门”不必在意。实际上,任何可以使用锁的物体都不必在意,例如胸部
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,门和柜子都将被解锁。
unlock()
$quantumLock
尽管我承认量子锁是一个不好的例子,但它说明了共享对象的概念,而不是在各处重建状态和责任。一个真实的示例可能是您 使用 数据库传递给类的数据库对象。
请注意,上面的示例没有显示如何使用lock()和unlock()方法进入“胸锁”或“门锁” 。我将其留作练习,以供您锻炼(或添加其他人)。
lock()