Интерфейс - передача класса или интерфейса в параметр в чем разница?

StalkerClasses

Новичок
PHP:
interface PersonInterface
{

}

interface CityInterface
{
    publuc function addPerson(PersonInterface $person);
    publuc function addPerson(Person $person);
}
В чем разница если передавать параметр как класс и как интерфейс в методе интерфейса?
Проектируя на основе интерфейсов по идее нет возможности 100% знать как будет называться класс...
В чем разница?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Разница в DI подходе, или абстракиця или конкретная реализация
 

WMix

герр M:)ller
Партнер клуба
класс это конкретно,
publuc function addPerson(Person $person);
зависит от Person
интерфейс это абстрактно
publuc function addPerson(PersonInterface $person)
так зависимость от любого конкретного класса который имплементирует PersonInterface
хоть КотМатроскин, хоть КорабльМаршелЖуков. (также Пользователь, Журналист, Президент, Программист)
конечно в наименоваеии PersonInterface абстракции мало, ну да не в этом вопрос
 

StalkerClasses

Новичок
Есть еще небольшой вопрос про parent::func()...
Изучая разные исходники обратил внимание что есть ситуации когда например parent::__construct() вызывается в начале функции, а есть где вызывается в конце функции. От чего это зависит? И как понять где (в начале или в конце) нужно вызывать родительский метод?
PHP:
class B extends A {

    function __construct()
    {
        parent::__construct(); // -иногда сверху
        // код
        parent::__construct(); // -иногда снизу
    }

}
 

StalkerClasses

Новичок
Разница в DI подходе, или абстракиця или конкретная реализация
класс это конкретно,
publuc function addPerson(Person $person);
зависит от Person
интерфейс это абстрактно
publuc function addPerson(PersonInterface $person)
так зависимость от любого конкретного класса который имплементирует PersonInterface
хоть КотМатроскин, хоть КорабльМаршелЖуков. (также Пользователь, Журналист, Президент, Программист)
конечно в наименоваеии PersonInterface абстракции мало, ну да не в этом вопрос
Из этих ответов к сожалению не понял.
Интерфейс - это высшая степень абстракции - некое видение (идея).
Как идея может знать что будет передан класс, который реализует ее интерфейс?
 

WMix

герр M:)ller
Партнер клуба
PHP:
class A{
    private $a;
    function __construct($a){
      $this->a = $a;
    }
    function getA(){
        return $this->a;
    }
}

class B extends A{
    protected $b;

   //сам как думаешь?
   function __construct($a, $b){
      //parent::__construct($a);
      $this->b = $this->getA() * $b;
      //parent::__construct($a);
    }
}
Как идея может знать что будет передан класс, который реализует ее интерфейс?
покажи когда это не так
 

WMix

герр M:)ller
Партнер клуба
да ей (идеи) по сути все равно, но метод уверен
 

AmdY

Пью пиво
Команда форума
Проектируя на основе интерфейсов по идее нет возможности 100% знать как будет называться класс...
В чем разница?
В этом и разница, ты не завязан на название класса. Зачем тебе знать какой код напишут другие и как класс обзовут? Тебе достаточно знать что реализованные определённые интерфейсы и ты можешь вызвать нужный метод с нужными параметрами.

Но ты, конечно, не делай так, пользуйся реализациями и завязывайся на имя класса. Ведь зная настоящие имена, ты можешь управлять вещами и поработить их душу.
 

WMix

герр M:)ller
Партнер клуба
Но ты, конечно, не делай так, пользуйся реализациями и завязывайся на имя класса. Ведь зная настоящие имена, ты можешь управлять вещами и поработить их душу.
* признаны в пхпклубе экстремистскими советами
 

fixxxer

К.О.
Партнер клуба
Связь через интерфейс - это подключение монитора через HDMI (или Display Port): можно купить любой монитор, поддерживающий таковой интерфейс (да, и тут интерфейс), подключить кабелем, и всё будет работать.

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

Yoskaldyr

"Спамер"
Партнер клуба
думал немного черной магии вбросить из разряда вредных советов как раз для ТС, но подумал что не стоит, ведь клуб читают часто очень не окрпшие умы и они все воспримут за чистую монету и будут думать что так и надо :)
 

StalkerClasses

Новичок
А конструктор что-то может возвращать в плане return?
Не могу найти примера. И как это может выглядеть?
 

StalkerClasses

Новичок
Здесь все прекрасно.
Не ужели это как то практически можно использовать (анонимные классы)?
Анонимные функции еще понимаю...

PHP:
// (new Container)->anonym()->print();
class Container
{
    private $title = 'Класс Container';
    protected $id = 1;

    public function anonym()
    {
        return new class($this->title) extends Container
        {
            private $name;

            public function __construct($title)
            {
                $this->name = $title;
            }

            public function print()
            {
                echo "{$this->name} ({$this->id})";
            }
        };
    }
}
 

WMix

герр M:)ller
Партнер клуба
пример не годный.
а про класс, мы же договорились вроде, что его имя не важно (анонимные классы), гораздо интересней, какие интерфейсы он поддерживает
 

StalkerClasses

Новичок
Дома лежит...
Не с этой книги рекомендовал бы себе сейчас начать.... Она ни о чем если нет базовых знаний и опыта, либо весь опыт это CMS и особенно Битрикс. Я PHP-занимался (когда этим зарабатывал) - последний раз в 2017.

Лучше такой план.
1) https://www.ozon.ru/product/php-7-141044025/?asb=4YCALInp3ANHC4aOcs649EgpfOktwMgzqIZq0yE6Ajw%3D&asb2=SLw9rxecRYWzTcOAi8v6N4Cq2c_IrqAiqxeYB9mDpcDH5gRQieBAbyOik-4cURf8&keywords=php7&sh=fG5HewAAAA
2) Потом https://phptherightway.com/#translations
3) И только потом эта книга.... Сейчас уже такая же вышла но про PHP84
4) После фреймворк (Ии, Ларавель, Симфони)
5) Прочитать документация на офф. сайте PHP
6) Вот как изучить все что вокруг языка PHP крутится (гит, докеры, серверное окружение, среда разработки, лиукс и что там еще пока не знаю). Хотя бы потому что нет точного списка актуальных технологий что учить для Backend-Разработчика.

Поэтому у меня все и шло через жопу... Что не с той литературы начал.
Я сейчас уже например разобрался что такое PSR, полиморфизм, интерфейсы, наследование, инкапсуляция. Композер, Чуть чуть гит.
 
Последнее редактирование:
Сверху