什么是PHP中的类?

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


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


想象一下锁定:

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方法将给我锁的当前状态。 现在,当您从该蓝图创建一个对象(通常也称为实例)时,它将封装唯一状态,例如

$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的类,例如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;
        }
    }
}

现在,当您创建一个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;
        }
    }
}

正如你所看到的,胸部的责任与门的责任是不同的。 胸部包含战利品,而门则分隔房间。 您可以将锁定状态或解锁状态编码到两个类中,但使用单独的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 ,Door和Chest都将被解锁。

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

请注意,上面的示例并未显示如何使用lock()unlock()方法进入“胸部锁定”或“门lock() 。 我将这留作锻炼,以供你锻炼(或其他人加入)。

同时检查何时使用自己超过$这? 有关类和对象的更深入的解释以及如何使用它们

对于一些额外的资源检查

  • http://en.wikipedia.org/wiki/Object-oriented_programming
  • http://www.php.net/manual/en/language.oop5.php
  • http://www.tuxradar.com/practicalphp
  • http://www.phpro.org/tutorials/Object-Oriented-Programming-with-PHP.html
  • http://articles.sitepoint.com/article/object-oriented-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( );
    

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


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

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

    只是我的两分钱。

    链接地址: http://www.djcxy.com/p/37797.html

    上一篇: What is a class in PHP?

    下一篇: Apply CodeMirror to a ng