我从书中了解PHP类时遇到了严重的问题。他们似乎很难。它们的目的是什么?它们如何工作?
Answers:
简而言之,类是对象的蓝图。对象封装了应用程序中某些内容在概念上相关的状态和责任,并且通常提供与之交互的编程接口。这促进了代码重用并提高了可维护性。
想象一个锁:
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类是应用程序中所有Lock的蓝图。锁可以被锁定或解锁,由属性 表示$isLocked
。由于它只能具有这两种状态,因此我使用布尔值(true
或false
)指示应用哪个状态。我可以通过Lock和方法 lock
与Lock进行交互unlock
,这将相应地更改状态。该isLocked
方法将给我锁的当前状态。现在,当您从此蓝图创建对象(也通常称为instance)时,它将封装唯一状态,例如
$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
,门和柜子都将被解锁。
尽管我承认量子锁是一个不好的例子,但它说明了共享对象的概念,而不是在各处重建状态和责任。一个真实的示例可能是您使用数据库传递给类的数据库对象。
请注意,上面的示例没有显示如何使用lock()
和unlock()
方法进入“胸锁”或“门锁” 。我将其留给您练习(或添加其他人)作为练习。
还要检查何时在$ this上使用self?有关类和对象以及如何使用它们的更深入的说明
有关其他资源,请检查
我知道您要的是资源,而不是解释,但这是我对类的基本实现的理解:
想象一下将类作为建筑模板。建筑物外观的基本草图。当您实际构建它时,您需要进行一些更改,使其看起来像您的客户想要的(对于class来说是属性)。现在,您必须设计建筑物内部事物的行为方式(方法)。我将在一个简单的例子上展示它。
建筑等级:
/**
* 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
}
}
叫课:
// 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( );
只需复制它,在您的本地主机上运行它,然后尝试进行一些更改。如有任何疑问,请问我。如果您觉得这没用,请使用以前的海报链接,这些教程都非常可靠。
如果可以的话,请换一个角度看(基于个人经验)。在真正理解所有内容之前,您需要先感到“ OOP的需要”-恕我直言,学习资源应紧随其后。
当编写相对较大的以过程方式编写的软件时(与面向对象相反,如果有人不同意该术语,对不起),人们基本上会“陷入”结构性困境。届时,他/她可以尝试将代码重组为对象以更好地组织代码,并且自然可以详细了解OOP。同样,这是我的亲身经历,它使我比任何本书都更快地了解。
只是我的两分钱。