什么是PHP中的类?

我从书中了解PHP类的严重问题。 他们看起来非常困难。 他们的目的是什么?他们是如何工作的?

简而言之 ,一个类是一个对象的蓝图。 一个对象在概念上封装了你的应用程序中相关的状态和责任,并通常提供一个编程接口来与这些接口进行交互。 这促进了代码重用并提高了可维护性。


想象一下locking:

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; } } 

现在忽略namespaceprivatepublic声明。

Lock类是应用程序中所有Lock的蓝图。 锁可以被locking解锁 ,由属性 $isLocked 。 由于它只能有这两种状态,所以我使用布尔值( truefalse )来表示哪个状态适用。 我可以通过它的方法 lockunlock来与Lock交互,这将相应地改变状态。 isLocked方法会给我锁的当前状态。 现在,当你从这个蓝图创build一个对象(通常也称为实例 )时,它将封装唯一的状态,例如

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

让我们创build另一个锁,也封装它自己的状态

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

但是因为每个对象/实例封装了它自己的状态,所以第一个锁保持locking状态

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

现在保持Lock被locking或解锁的整个权限被锁在Lock类中。 每次你想locking某些东西时,你不需要重build它,如果你想改变一个锁的工作方式,你可以在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; } } } 

现在当你创build一个Door对象时,你可以给它分配一个Lock对象。 由于Lock对象负责处理是否locking或解锁的所有责任,因此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; } } } 

正如你所看到的,胸部的责任与门的责任是不同的。 一个箱子里装着战利品,而一扇门隔开了房间。 您可以将locking状态或解锁状态编码到两个类中,但是使用单独的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 ,门和胸部都将被解锁。

虽然我承认量子锁是一个不好的例子,但它说明了共享对象的概念,而不是重build状态和责任到处。 一个真实世界的例子可能是一个数据库对象,你传递给使用数据库的类。

请注意,上面的示例没有显示如何使用lock()unlock()方法进入“胸部locking”或“门lock() 。 我把这个作为一个练习来解决你的问题(或者其他人添加)。

另外检查什么时候使用自己超过$这? 以便更深入地了解类和对象以及如何使用它们

对于一些额外的资源检查

我知道你问了一个资源,而不是一个解释,但这里是我了解类的基本实现的东西:

把class级想象成build筑的模板。 一个build筑物应该是什么样子的基本草图。 当你要真正build立它,你改变一些东西,看起来像你的客户想要的( 类的情况下)。 现在,你必须devisebuild筑物内部的行为( 方法 )。 我将以一个简单的例子来展示它。

build筑类:

 /** * 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( ); 

只要复制它,在你的本地主机上运行,​​并尝试做一些改变。 如有任何问题,请问我。 如果你没有find有用的东西,只要使用以前海报的链接,这些都是非常可靠的教程。

如果我愿意,可以从另一个angular度提出一个观点(根据个人经验)。 你需要感受到“面向对象的需求”,然后才能真正理解它到底是什么 – 恕我直言,学习资源应该在这之后。

在编写比较大型的程序风格的软件时(相对于面向对象,如果有人不同意,抱歉),基本上“需要”陷入结构困境。 届时,他/她可以尝试将代码重构为对象,以便更好地组织,并自然地详细了解OOP。 再次,这是我的个人经验,它使我比任何书都更快地理解。

只是我的两分钱。