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

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

Related of "Что такое класс в PHP?"

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


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

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

 $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 , обе двери и сундук будут разблокированы.

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

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

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

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

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

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

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