За последние 24 часа нас посетили 18875 программистов и 1702 робота. Сейчас ищет 641 программист ...

Интерфейсы

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

  1. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Всем доброго времени суток! ;)
    Начал изучать ООП и столкнулся с не понимаем темы интерфейсов, а именно для чего они нужны, как я понял это некий абстрактный метод, который при необходимости будет реализован классом?
    Может кто-то подсказать для чего они применяются.
    Я ниже кое чего своей кривой ручкой написал, но наверное это не лучшее применение :)
    Код (Text):
    1. $counter = isset($_COOKIE['counter']) ? $_COOKIE ['counter'] : 0;
    2. $counter++;
    3. setcookie("counter", $counter);
    4. if ($counter > 2) {
    5.     $alert = "раза";
    6. } else {
    7.     $alert = "раз";
    8. }
    9.  
    10. interface Geter {
    11.     public function GetInfo ();
    12. }
    13. class GetVisited implements Geter {
    14.   public $count;
    15.     function GetInfo () {
    16.         return $this->count;
    17.     }
    18.    
    19. };
    20. $test = new GetVisited ();
    21. $test->count = $counter;
    22. echo "<br>Пользователь посетил страницу\n" . date("y.m.d") . "<br>" . $test->GetInfo () . ' ' . $alert;
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    когда ты в коде хочешь дёрнуть некий метод некоего объекта, то ты ожидаешь, что это такой объект, как надо, что у объекта есть нужный метод и он кушает те параметры, которые ты в него собрался скормить.

    удостовериться в этом можно например отказавшись принимать в работу что-то кроме экземпляров определённого класса, например MySomeClass. Тогда, чтобы ты сам или другие могли что-то поменять в логике местами по необходимости, но чтобы всё работало как раньше ты просто наследуешься от класса MySomeClass и будет работать.

    Но соврешенно не обязательно заставлять других наследоваться от некоего класса, т.к. тебе нужно быть уверенным только в том, что оно работает как ты ожидаешь. Достаточно сказать, что ты ожидаешь от объекта, что ты ждёшь, что он будет высовывать наружу методы, указанные в интерфейсе, а как класс называется и от кого он отнаследовался - тебе не важно. Поэтому ты создаёшь интерфейс, отдаёшь его всем желающим или даже себе, дальше ты кодишь думая только о том, чтобы методы были, и принимали указанные параметры. И всё работает, ничего не сыпется.
     
    Danil005, Walk и kentkent7 нравится это.
  3. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Спасибо!)
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нэзашто, дарагой
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @kentkent7, почитай Мэтта Зандстру, будет детально понятно, для чего нужны в том числе интерфейсы
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    Не для чего. Один кодишь ? забудь про интерфейсы
     
  7. Алекс8

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

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

    так вот интерфейс задает стандартизацию для написания классов разными людьми)) что бы у всех были одинаковые свойства)) колеса, фары и т.п.
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @Алекс8
    но ведь можно отнаследоваться от базового автомобиля =)
    зачем интерфейс?
     
  9. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Это не важно один или нет. Программирование на уровне интерфейсов дает гибкую расширяемость, собственно всю суть данного подхода раскрывает паттерн стратегия.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Это не верно. Интерфейсы нужны там, где пользуют полиморфизм. Конечно, если всё на скучных статических классах, они ни к чему. Но если нормальное ООП, то абстрактные классы и интерфейсы - основа. Интерфейс - фактически, абстрактный класс, в котором не реализован ни один метод и нет полей. То что ты не используешь приёмы ООП, не значит, что они не нужны. Инверсию зависимости, к примеру. Или абстрактные фабрики.

    Можно. Но абстрактный базовый автомобиль - это если есть что-то кроме абстрактных методов. Интерфейс - когда одни методы, и все абстрактные. Кстати, можно сделать интерфейс ТоЧтоЕздит, сделать в нём методы ехать, стоять и т.п., и после этого сделать автомобили, трамваи и прочие транспортные средства. Возможно, в каком-то контексте будет всё равно, что заставлять ехать/стоять, автомобиль или трамвай, и тогда можно рассчитывать просто на интерфейс. Ну ты как раз об этом и писал. К тому же, в PHP нельзя наследоваться от нескольких классов, но можно реализовать несколько интерфейсов (ты, конечно, это знаешь, но чтоб было для людей)
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Упрощённый пример использования интерфейсов в текущем проекте. Мне надо оперировать сущностями с динамическим набором свойств, которые к тому же определяются пользователем. И эту всю фигню надо извлекать из базы данных, по разному сортировать и т.п. Но как бы это всё не было отсоритровано, отфильтровано и т.п., собственно код, отвечающий за извлечение из базы строк и расфасовки их по объектам не меняется. Поэтому я делаю так:
    PHP:
    1. interface StorageFilter {
    2.     public function filter(Builder $query); // Builder - это Query Builder из Laravel
    3. }
    4.  
    5. class EntityStorage {
    6.      public function readEntities(StorageFilter $filter = null)
    7.      {
    8.           $query =\DB::table("entityTable"); // Создаёт построитель запроса по определённой таблице
    9.           if ($filter) {
    10.                $filter->filter($query);
    11.           }
    12.           $results = $query->get()->all();
    13.           /* Логика преобразования всего полученного в объекты моих классов */
    14.      }
    15. }
    16. $storage = new EntotyStorage;
    17. $entities = $storage->readEntities(new PropertyValueFilters($_GET["filter"]));
    18. $entities = $storage->readEntities(new CreatedBetween($date1, $date2));
    19.  
    20. // А тут паттерн "композит", собираем вместе сколько угодно разных условий
    21. $entities = $storage->readEntities(new QueryModifiersCollector([
    22.       new PropertyValueFilters($_GET["filter"]),
    23.      new CreatedBetween($date1, $date2),
    24.      new OwnerIs(\Auth::user())
    25. ]);
    Конкретные реализации фильтров должны быть понятны по названию. И это ещё не конгфу, можно наверное было бы и круче сделать
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    @mkramer не соглашусь. Даже в ООП если сам себе хозяин, от интерфейсов толку 0
    --- Добавлено ---
    @t1grok я смотрел, читал, и так и не нашел суть интеров
    --- Добавлено ---
    5 или 16 строке ошибка
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Я же привёл пример, из реального проекта. К тому же, если у меня интерфейс, я могу отнаследоваться от любого класса, и одновременно реализовать интерфейс. Мне это напоминает ситуацию в детстве, когда я уже освоил Turbo Pascal, а мой знакомый только BASIC. И он увидел у меня строк 100 интерфейсной части модуля, и давай спрашивать: а эта строчка что делает? А эта? И был удивлён, что из 50 строк ни одна не делала реальной работы
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Зависит от проекта. Много чего толку ноль, когда что-то мелкое делаешь. Многие вещи только замедляют и усложняют разработку если проект не дорос до них. Но, с определенного момента, проект это перерастает.

    Сегодня ты сам себе хозяин. А завтра ты нанял помощника себе. И понеслась...

    А так, можно и про ООП говорить, что оно никому не нужно. Потому что когда делаешь что-то мелконькое, ООП больше мешает, чем помогает. Будет у тебя либо куча статики, либо одноразовых классов, по одному объекту на каждый за вызов, не более.

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

    Инструментария много. И у каждого своя применимость. Если ситуация, когда инструмент нужен не наступила, это не значит, что он не нужный в принципе никому никогда.
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    c этим другая ситуация, где объекты выигрывают по использованию памяти нежели массивы
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Нигде. Не ОО-программы обычно быстрее и меньше памяти занимают, там где это критично очень, там ОО не пишут (в коде операционных систем, к примеру). ОО даёт преимущество, что меньше кода, меньше связанность (если всё правильно делать), легче сопровождать и дополнять (опять же, если удалось всё сделать правильно), но за это всё расплата - снижение в целом производительности. В том же моём примере запрос строится проходя через несколько уровней моего кода и фреймворка, понятно, что если его сразу написать в строке, будет быстрее и меньше памяти. Но зато я получаю большую гибкость.

    Как один лектор говорил, что при крупной системе легче железку докупить, чем разбираться в хорошо оптимизированной, но нечитаемой программе
     
  17. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Пока один, но хочу в октябре джуном устроиться, а чтобы не выглядеть как ололошка :) хочу все подучить.
     
  18. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Обосрёшься энивей.
     
    MouseZver нравится это.
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    плеснул позитивом прям в ебало
    что с тобой? День плохой?
     
  20. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Ну обосрусь, тогда буду дальше учить и разбирать непонятные для меня темы :)
    Если сильно захотеть, можно в космос полететь)
     
    Fell-x27 нравится это.
  21. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    Голова с яйцами лопнет все на все.
    https://habrahabr.ru/post/233129/
     
  22. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Ну хоть основное, а дальше буду плясать по мере необходимости)
    Спасибо за ссылку!
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Других критериев нет? Эти вот наследования, оверрайды, неймспейсы, инстанцирование, трейты, разные уровни абстракций, модификаторы доступа, это вот все по-твоему для выигрывания по использованию памяти было сделано? Не для упрощения построения сложных архитектур? Не для расширения понятия "повторно используемый код" на уровень выше функций? Не для грамотного структурирования кода? Не для возможности построения "умных" интерфейсов? Не для модульности? Не для дополнительного слоя абстракции? Не для удобства поддержки и расширения?
     
  24. MouseZver

    MouseZver Суперстар

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

    тупо интерфейсы для создания правил чтобы внедряли свои плюшки программисты. Одним словом - маска. Макияж для женщин
    --- Добавлено ---
    вот именно, всеголишь... на большее не даны. Ничего не выдают ( кроме подзатылника инстанце бла бла ), нигде ничего не хранят, ничего не творят, доп трата на подключение на ничто.
    --- Добавлено ---
    предпочтение отдам лишь текучим
    https://habrahabr.ru/post/170019/
     
  25. igordata

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

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


    [​IMG]