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


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

3 68

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 декларацию прямо сейчас.

класс Замок это схема элементов для всех блокировок в вашем приложении. Замок может быть либо закрытая или разблокирован в лице свойства$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

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

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;
        }
    }
}

теперь при создании объекта двери вы можете назначить ему объект блокировки. Поскольку объект блокировки обрабатывает всю ответственность за то, что что-то заблокировано или разблокировано, дверь не должна заботиться об этом. На самом деле любые объекты, которые может использовать замок не придется заботиться, например грудь

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;
        }
    }
}

как вы можете видеть, отзывчивость сундука отличается от двери. Сундук содержит добычу, в то время как дверь отделяет комнаты. Вы можете закодировать заблокированное или разблокированное состояние в оба класса, но с отдельным классом блокировки вам не нужно и вы можете повторно использовать блокировку.

$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() the $quantumLock, обе двери и грудь будет разблокирован.

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

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

также проверить когда использовать себя над $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( );

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

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

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

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