Gor*_*don 197
简而言之,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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在忽略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
Run Code Online (Sandbox Code Playgroud)
让我们创建另一个锁,同时封装它自己的状态
$anotherLock = new Lock;
$anotherLock->unlock(); // You unlocked the Lock
Run Code Online (Sandbox Code Playgroud)
但是因为每个对象/实例都封装了它自己的状态,所以第一个锁保持锁定状态
var_dump( $aLock->isLocked() ); // gives Boolean true
var_dump( $anotherLock->isLocked() ); // gives Boolean false
Run Code Online (Sandbox Code Playgroud)
现在,锁定或解锁锁定的整个可靠性都是在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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当您创建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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,胸部的可靠性与门的不同.胸部包含战利品,而门则将房间隔开.您可以将锁定或解锁状态编码到两个类中,但是使用单独的Lock类,您不必重复使用Lock.
$doorLock = new Lock;
$myDoor = new Door($doorLock);
$chestLock = new Lock;
$myChest new Chest($chestLock);
Run Code Online (Sandbox Code Playgroud)
胸部和门现在有他们独特的锁.如果锁是一个可以同时存在于多个地方的魔法锁,就像在量子物理中一样,你可以为胸部和门分配相同的锁,例如
$quantumLock = new Lock;
$myDoor = new Door($quantumLock);
$myChest new Chest($quantumLock);
Run Code Online (Sandbox Code Playgroud)
当你unlock()
的$quantumLock
,无论是门和胸部将被解锁.
虽然我承认量子锁是一个不好的例子,但它说明了共享对象的概念,而不是在整个地方重建状态和责任.一个真实世界的示例可以是您使用数据库传递给类的数据库对象.
请注意,上面的示例没有显示如何进入Lock of a Chest或Door以使用lock()
和unlock()
方法.我将此作为练习让您锻炼(或其他人添加).
还要检查何时使用self超过$ this?有关类和对象的更深入解释以及如何使用它们
对于一些额外的资源检查
Ond*_*ták 13
我知道你要求一个资源,而不是一个解释,但这是我所理解的基本类实现的东西:
想象一下课程作为建筑的模板.建筑物应该是什么样子的基本草图.当你打算实际构建它时,你会改变一些东西,使它看起来像你的客户想要的(在类的情况下属性).现在你必须设计建筑内部的事物将如何表现(方法).我将在一个简单的例子中展示它.
建筑类:
/**
* 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
}
}
Run Code Online (Sandbox Code Playgroud)
打电话给班级:
// 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( );
Run Code Online (Sandbox Code Playgroud)
只需复制它,在本地主机上运行它并尝试进行一些更改.如有任何问题,请问我.如果你没有发现这个有用,只需使用以前海报的链接,这些都是非常扎实的教程.