什么是PHP中的类?

什么是PHP中的类?,php,class,Php,Class,我在理解一本书中的PHP类时遇到了严重的问题。他们似乎很难。它们的用途是什么?它们是如何工作的?我知道您要求的是资源,而不是解释,但以下是我对类的基本实现的理解: 将类想象为建筑的模板。一个建筑应该是什么样子的基本草图。当您要实际构建它时,您会更改一些东西,使它看起来像您的客户机想要的(类的属性)。现在,您必须设计建筑物内部的行为(方法)。我将在一个简单的例子中展示它 建筑类别: /** * Constructs a building. */ class Building { pri

我在理解一本书中的PHP类时遇到了严重的问题。他们似乎很难。它们的用途是什么?它们是如何工作的?

我知道您要求的是资源,而不是解释,但以下是我对类的基本实现的理解:

将类想象为建筑的模板。一个建筑应该是什么样子的基本草图。当您要实际构建它时,您会更改一些东西,使它看起来像您的客户机想要的(类的属性)。现在,您必须设计建筑物内部的行为(方法)。我将在一个简单的例子中展示它

建筑类别:

/**
 * 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( );
调用类:

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

只需复制它,在本地主机上运行它,并尝试进行一些更改。如果有任何问题,就问我。如果你觉得这没什么用,只需使用之前海报的链接,这些都是非常可靠的教程。

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


想象一下一把锁:

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;
    }
}
立即忽略
名称空间
私有
公共
声明

Lock类是应用程序中所有锁的蓝图。锁可以被锁定或解锁,由属性
$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类中。您不必每次锁定某个对象时都重新构建它,如果您想更改锁的工作方式,您可以在锁的蓝图中更改它,而不是在所有具有锁的类中,例如门:

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;
        }
    }
}
现在,创建门对象时,可以为其指定锁对象。由于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;
        }
    }
}
正如你所看到的,胸部的敏感度不同于门的敏感度。箱子里装着战利品,门把房间隔开。您可以将锁定或解锁状态编码到这两个类中,但是使用单独的锁类,您不必也可以重用锁

$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()
方法打开箱子或门的锁。我把这作为一个练习留给你去做(或者其他人去补充)

还要检查类和对象以及如何使用它们的更深入的解释

有关其他资源,请查看


如果可以的话,我可以从另一个角度提供一个视角(基于个人经验)。在你真正理解OOP之前,你需要感受到“OOP的需求”——嗯,学习资源应该紧跟其后

在编写以过程式风格编写的相对较大的软件时,基本上“需要”陷入结构性困难(与面向对象相反,如果有人不同意这个术语,请原谅)。到那时,他/她可以尝试将代码重组为对象,以更好地组织它,当然,还可以更详细地了解OOP。同样,这是我的个人经历,它让我比任何一本书都更快地理解


只要我的两分钱

类是对象的蓝图。有汽车的名称。我们在类中定义变量和方法。类是用大括号定义的。在大括号内可以定义变量、方法、属性和函数。函数和方法都是相同的。您可以根据需要定义方法和变量为类花括号

班车{

}

foreach(获取声明的类()作为$class){

echo($class)。“
”;
}

get_declared_classes()是php中的预定义函数。它返回已声明类的名称数组