什么是PHP类?

时间:2010-02-05 10:02:37

标签: php class

我从一本书中了解PHP类的严重问题。他们似乎很难。他们的目的是什么以及他们如何运作?

4 个答案:

答案 0 :(得分: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;
    }
}

立即忽略namespaceprivatepublic声明。

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

$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的蓝图中改变它,而不是所有拥有一个锁的类,例如一扇门:

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时,门和胸部都将被解锁。

虽然我承认Quantum Locks是一个不好的例子,但它说明了共享对象的概念,而不是在整个地方重建状态和责任。一个真实世界的示例可以是您使用数据库传递给类的数据库对象。

请注意,上面的示例并未说明如何使用lock()unlock()方法进入胸部或门的锁定。我将此作为练习让你锻炼(或其他人添加)。

另请查看When to use self over $this?以获取有关类和对象的更深入说明以及如何使用它们

对于其他一些资源,请检查

答案 1 :(得分:13)

我知道你要求提供资源,而不是解释,但这是我理解的基本类实现的东西:

想象一下课程作为建筑的模板。建筑物应该是什么样子的基本草图。当你打算实际构建它时,你会改变一些东西,使它看起来像你的客户想要的(属性 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( );

只需复制它,在本地主机上运行它并尝试进行一些更改。如有任何问题,请问我。如果你没有发现这个有用,只需使用以前海报的链接,这些都是非常扎实的教程。

答案 2 :(得分:2)

如果我愿意,可以从另一个角度提供观点(根据个人经验)。在你真正了解它的全部内容之前,你需要感受到“OOP的需要” - 恕我直言,学习资源应该在此之后出现。

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

只是我的两分钱。

答案 3 :(得分:0)

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

级车{

}

foreach( get_declared_classes()作为$ class){

echo ($class)."<br>";

}

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

enter image description here