Что такое класс в PHP? - PullRequest
       13

Что такое класс в PHP?

68 голосов
/ 05 февраля 2010

У меня серьезные проблемы с пониманием классов PHP из книги. Они кажутся очень сложными. Какова их цель и как они работают?

Ответы [ 3 ]

198 голосов
/ 05 февраля 2010

В двух словах , 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;
    }
}

Прямо сейчас игнорируйте декларации namespace, private и public.

Класс 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;
        }
    }
}

Теперь, когда вы создаете объект Door, вы можете назначить ему объект Lock. Поскольку объект 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 вам не нужно и вы можете повторно использовать 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(). Я оставляю это как упражнение для вашей работы (или кого-то еще, чтобы добавить).

Также отметьте Когда использовать self вместо $ this? для более подробного объяснения Классов и Объектов и как с ними работать

Для некоторых дополнительных ресурсов проверьте

13 голосов
/ 05 февраля 2010

Я знаю, что вы просили ресурс, а не объяснение, но вот что я понял под базовой реализацией классов:

Представьте класс как шаблон здания. Основной эскиз, как должно выглядеть здание. Когда вы собираетесь его на самом деле собрать, вы изменяете некоторые вещи так, чтобы они выглядели так, как того хочет ваш клиент (свойства в случае 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 голосов
/ 17 марта 2010

Чтобы предложить вид с другой стороны, если я могу (на основе личного опыта). Вам нужно почувствовать «потребность в ООП», прежде чем вы действительно сможете понять, о чем идет речь - ИМХО, после этого должны появиться учебные ресурсы.

При написании относительно большого программного обеспечения, написанного в процедурном стиле, в основном «нужно» застрять в структурных трудностях (в отличие от объектно-ориентированного, извините, если кто-то не согласен с этим термином). К тому времени он / она может попытаться реструктурировать код в объекты, чтобы лучше организовать его и, естественно, узнать больше об ООП в деталях. Опять же, это мой личный опыт, и он привел меня к пониманию быстрее, чем любая книга.

Только мои два цента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...