За последние 24 часа нас посетили 35023 программиста и 1734 робота. Сейчас ищут 829 программистов ...

interface class

Тема в разделе "PHP для новичков", создана пользователем MouseZver, 14 июл 2017.

  1. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    Доброе время суток.
    Хочу полностью разобраться с интерфейсами в ООП. Сколько не гуглил и читал с примерами, постоянно ведется недопонимание в их юзанья, а точнее какая в них полезность. На данный момент у меня в голове сложилось четкое понимание о них как составление описывающих классов с правилами ( какой класс с какими методами по дефолту должны содержать )

    ВСЕ

    так какая же изюменка от интерфейсов, кроме как "помогает сторонним кодерам ориентироваться в твоем говнокоде" ? :)
    --- Добавлено ---
    PHP:
    1. <?
    2.  
    3. interface PHP_inter
    4. {
    5.     public function add();
    6. }
    7.  
    8. class PHP_one implements PHP_inter
    9. {
    10.     public function __construct ( $a )
    11.     {
    12.         $this -> val = $a;
    13.     }
    14.     public function add()
    15.     {
    16.         return $this -> val;
    17.     }
    18. }
    19.  
    20. class PHP_two
    21. {
    22.     public function __construct (){}
    23.    
    24.     public function test( root $b )
    25.     {
    26.         return $b -> add();
    27.     }
    28. }
    29.  
    30. $one = new PHP_one( 44 );
    31.  
    32. $two = new PHP_two;
    33.  
    34. echo $two -> test( $one ); # 44
    с тем же замахом я могу тупо взять удалить интерфейс и в методе тест наименование. Тот же результат будет :confused:
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ни
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    в пекло интерфейсы
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не понимаю, чего ты не понимаешь

    интерфейс удобный способ знать заранее, что есть методы. А какой класс - не важно. Это удобнее, чем наследоваться от отдного класса всегда. Иногда это не нужно. Достаточно наследоваться от некоей договорённости о методах. Вот и всё.
     
    Maputo нравится это.
  5. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я кстати тоже такой же вывод сделал)) абстрактные, финальные классы - это для того что бы другим было удобно))
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    от одного
    --- Добавлено ---
    наследование через интерфейсы, а не через extends ? или не понял твое предложение
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Для того, чтобы тебе было удобнее. Мало ли что нужно будет сделать с проектом через год. Вот к примеру, пришлось мне писать проект на Code Igniter, противный такой недофреймворк. Код, составляющий самую основу проекта, благодаря интерфейсам написан так, что я могу подменить часть работающую с БД, на работу через слой любого фреймворка, он там сосредоточен. Потом, я могу переписать код на работу с любой базой данных минимальными усилиями. Ну и потом, автоматическое тестирование - если класс зависит от интерфейса, а не от другого класса, то можно подменить реализацию на тестовую, гарантированно работающую но дебильно простую, чтоб не отвлекаться. Но это про интерфейсы.

    Абстрактные классы же могут содержать часть функционала, тут вообще другая история. Паттерн "шаблонный метод", к примеру, реализуется через абстрактный класс. Да и много чего. В принципе, сама суть ООП в абстрактных классах. Если код с классами не содержит полиморфизма, его можно запросто переписать на процедуры, он только упростится от этого. Если не нужен полиморфизм, т.е. нигде нету необходимости работать с экземпляром наследника так, как будто работаешь с экземпляром родителя, значит не нужно ООП. Без полиморфизма оно вообще ничего не даёт.
     
    villiwalla нравится это.
  8. SXdevel

    SXdevel Активный пользователь

    С нами с:
    24 июн 2017
    Сообщения:
    5
    Симпатии:
    0
    Интерфейс простейшая инструкция к классу какие методы использовать. Можно конечно и в абстрактном родителе их объявить, но тогда четко надо прописывать public к открытым методам и protected к общим методам классов библиотеки и потом смотреть где что. В случае с интерфейсом тупо скопировал методы без разбора и пиши свою реализацию. Плюс заглядываешь в родителя абстрактного, если есть он конечно, и уже решаешь нужны ли тебе общие методы и стоит ли от него наследоваться. Кому то удобно, кому то нет.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    в том примере я бы с таким успехом выполнил бы со статическим методом, где используется интерфейс
    (UsersInterface $users)

    User::addUser

    меньше кода.

    и тут снова начинаю гнобить чертовы интерфейсы о их существований, так как альтернативу могу прописать
     
  11. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @MouseZver, единственное адекватное использование интерфейсов, которое мне приходилось применять - это проверка принадлежности экземпляров разных классов к одному интерфейсу. Как выше было сказано:

     
    #11 Maputo, 15 июл 2017
    Последнее редактирование: 15 июл 2017
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @MouseZver ты сделай без интерфейсов объект, который можно передать в foreach
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    @MouseZver, почитай про инверсию зависимостей и SOLID. Без интерфейсов там никак
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    в фору передается массив, а не объект. Недопонял смысл
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    В PHP есть конструкции, вроде foreach и throw. И есть стандартные типы и классы, вроде array и Exception, которые можно использовать с этими конструкциям.
    Хочешь бросить исключение - используй только new Exception. Нет! Wrong way! throw - это часть языка. А класс - не должен быть частью языка. Не справедливо ограничивать применение языковых конструкций только лишь теми классами, которые написали авторы PHP-машины. Поэтому в PHP добавили интерфейс Throwable. В будущем можно будет "бросить" любой объект, имплементирующий этот интерфейс, и одновременно несколько других.
    А теперь поставь на место встроенных конструкций, собственные функции, работающие с объектами. Ты не должен заставлять программиста, который будет этим пользоваться, использовать твои классы. Дай ему интерфейсы, чтобы он мог использовать твои функции со своими объектами.
     
    MouseZver нравится это.
  17. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень