Скажем, я создаю сундук с замком …
простирающийся
class Lock
{
public $locked = false;
function lock()
{
$this->lock = true;
}
function unlock()
{
$this->lock = false;
}
}
class Chest extends Lock
{
}
$myChest = new Chest;
Использование интерфейсов:
<?php
interface Lock
{
protected $locked;
function lock();
function unlock();
}
trait LockTrait
{
protected $locked = false;
function lock()
{
$this->lock = true;
}
function unlock()
{
$this->lock = false;
}
}
class Chest implements Lock
{
use LockTraits;
}
$myChest = new Chest;
Использование внедрения зависимостей на основе классов:
class Lock
{
public $locked = false;
function lock()
{
$this->lock = true;
}
function unlock()
{
$this->lock = false;
}
}
class Chest
{
protected $lock;
function __construct($lock)
{
$this->lock = $lock;
}
}
$myChest = new Chest(new Lock);
Существуют различия как в реализации, так и в характеристиках получаемого объекта. Расширение и использование интерфейсов приведет к Chest
объекты, которые имеют свойства и методы Lock
учебный класс. Внедрение нового экземпляра Lock
класс в конструктор Chest
класс приведет к свойству Chest
класс, являющийся замком.
Мне кажется, что лучший способ создать мой Chest
Цель состоит в том, чтобы ввести Lock
экземпляр в Chest
конструктор. Это приводит меня ко второму вопросу, хотя. Где бы я использовал интерфейсы и расширения?
Кажется, ответ на этот вопрос звучит так: «Когда у меня несколько классов, которые имеют сходные характеристики!» Я бы тогда использовал принцип «есть» для абстрактных черт.
Тем не менее, когда я должен расширить и когда я должен использовать интерфейсы? Я могу использовать много интерфейсов, пока могу только extend
один урок. Зачем когда-либо продлевать? Почему бы просто не использовать интерфейсы?
Задача ещё не решена.
Других решений пока нет …