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

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

68
задан tereško 12 July 2014 в 07:53
поделиться

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

Прямо сейчас игнорируйте объявления пространства имен , private и public .

Класс Lock - это образец всех блокировок в вашем приложении. Блокировка может быть либо заблокированной , либо разблокированной , представленной свойством $ isLocked . Поскольку он может иметь только эти два состояния, я использую логическое значение ( истина или ложь ), чтобы указать, какое состояние применяется. Я могу взаимодействовать с 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 вместо всех классов , имеющих Lock, например a 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 не должен заботиться об этом. Фактически, любые объекты, которые могут использовать Замок, не должны заботиться, например, Сундук

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

и когда вы разблокируете () $ QuantumLock , разблокируются и дверь, и сундук.

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

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

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

Дополнительные ресурсы см.

197
ответ дан 24 November 2019 в 14:02
поделиться

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

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

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

13
ответ дан 24 November 2019 в 14:02
поделиться

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

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

Всего два цента.

2
ответ дан 24 November 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: