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

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

Ответ 1

В двух словах, класс является планом для объекта. И объект инкапсулирует концептуально связанное состояние и ответственность чего-то в вашем приложении и обычно предлагает интерфейс программирования, с которым можно взаимодействовать с ними. Это способствует повторному использованию кода и повышает ремонтопригодность.


Представьте замок:

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 через его методы 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. Вам не нужно перестраивать его каждый раз, когда вы хотите что-то заблокировать, и если вы хотите изменить способ работы 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 обрабатывает всю ответственность за то, что что-то заблокировано или разблокировано, двери не нужно заботиться об этом. Фактически, любые объекты, которые могут использовать 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 вам не нужно и может повторно использовать блокировку.

$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 over $this? для более подробного объяснения классов и объектов и того, как с ними работать

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

Ответ 2

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

Представьте себе класс как шаблон построения. Основной пример того, как должно выглядеть здание. Когда вы собираетесь его строить, вы меняете некоторые вещи, чтобы он выглядел так, как ваш клиент хочет (свойства в случае класса). Теперь вам нужно спроектировать, как вещи внутри здания будут вести себя (методы). Я покажу это на простом примере.

Класс здания:

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

Просто скопируйте его, запустите на своем локальном хосте и попробуйте сделать некоторые изменения. В случае каких-либо вопросов, просто спросите меня. Если вы не найдете это полезным, просто используйте ссылки предыдущих плакатов, это довольно прочные учебники.

Ответ 3

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

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

Просто мои два цента.