В двух словах , Class - это план объекта. И объект инкапсулирует концептуально связанные Состояние и Ответственность чего-либо в вашем Приложении и обычно предлагает программный интерфейс для взаимодействия с ними. Это способствует повторному использованию кода и улучшает удобство обслуживания.
Представь себе замок:
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? для более подробного объяснения Классов и Объектов и как с ними работать
Для некоторых дополнительных ресурсов проверьте