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

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

3 ответа

Решение

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


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

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? для более глубокого объяснения Классов и Объектов и как работать с ними

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

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

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

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

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

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

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

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

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

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

классная машина {

}

foreach (get_declared_classes () как $class){

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

}

get_declared_classes() - это предопределенная функция в php, которая возвращает массив имен объявленных классов.

Другие вопросы по тегам