gpt4 book ai didi

php - PHP 中的类是什么?

转载 作者:IT老高 更新时间:2023-10-28 11:58:27 25 4
gpt4 key购买 nike

我在从一本书中理解 PHP 类时遇到了严重的问题。他们似乎非常困难。它们的目的是什么以及它们是如何工作的?

最佳答案

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


想象一把锁:

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 类是应用程序中所有锁的蓝图。锁可以是锁定解锁,由属性 $isLocked表示。由于它只能具有这两种状态,因此我使用 bool 值(truefalse)来指示适用的状态。我可以通过它的 methods lockunlock 与 Lock 进行交互,这将相应地改变状态。 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 类中。您不必在每次想要锁定某些东西时都重新构建它,如果您想更改锁的工作方式,您可以在锁的蓝图中更改它,而不是所有类拥有一个锁,例如一扇门:

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 的对象都不必关心,例如 Chest

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() 方法到达箱子或门的锁。我将此作为练习留给您(或其他人添加)。

同时检查 When to use self over $this?更深入地解释类和对象以及如何使用它们

对于一些额外的资源检查

关于php - PHP 中的类是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2206387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com