Всем доброго времени суток! Начал изучать ООП и столкнулся с не понимаем темы интерфейсов, а именно для чего они нужны, как я понял это некий абстрактный метод, который при необходимости будет реализован классом? Может кто-то подсказать для чего они применяются. Я ниже кое чего своей кривой ручкой написал, но наверное это не лучшее применение Код (Text): $counter = isset($_COOKIE['counter']) ? $_COOKIE ['counter'] : 0; $counter++; setcookie("counter", $counter); if ($counter > 2) { $alert = "раза"; } else { $alert = "раз"; } interface Geter { public function GetInfo (); } class GetVisited implements Geter { public $count; function GetInfo () { return $this->count; } }; $test = new GetVisited (); $test->count = $counter; echo "<br>Пользователь посетил страницу\n" . date("y.m.d") . "<br>" . $test->GetInfo () . ' ' . $alert;
когда ты в коде хочешь дёрнуть некий метод некоего объекта, то ты ожидаешь, что это такой объект, как надо, что у объекта есть нужный метод и он кушает те параметры, которые ты в него собрался скормить. удостовериться в этом можно например отказавшись принимать в работу что-то кроме экземпляров определённого класса, например MySomeClass. Тогда, чтобы ты сам или другие могли что-то поменять в логике местами по необходимости, но чтобы всё работало как раньше ты просто наследуешься от класса MySomeClass и будет работать. Но соврешенно не обязательно заставлять других наследоваться от некоего класса, т.к. тебе нужно быть уверенным только в том, что оно работает как ты ожидаешь. Достаточно сказать, что ты ожидаешь от объекта, что ты ждёшь, что он будет высовывать наружу методы, указанные в интерфейсе, а как класс называется и от кого он отнаследовался - тебе не важно. Поэтому ты создаёшь интерфейс, отдаёшь его всем желающим или даже себе, дальше ты кодишь думая только о том, чтобы методы были, и принимали указанные параметры. И всё работает, ничего не сыпется.
я добавлю как я это понимаю))) к примеру может быть много классов которые описывают разные автомобили.. но у всех автомобилей есть схожие свойства)) колеса, двигатель, фары и т.п. и в классе нужно написать метод который описывает все эти свойства)) так вот интерфейс задает стандартизацию для написания классов разными людьми)) что бы у всех были одинаковые свойства)) колеса, фары и т.п.
Это не важно один или нет. Программирование на уровне интерфейсов дает гибкую расширяемость, собственно всю суть данного подхода раскрывает паттерн стратегия.
Это не верно. Интерфейсы нужны там, где пользуют полиморфизм. Конечно, если всё на скучных статических классах, они ни к чему. Но если нормальное ООП, то абстрактные классы и интерфейсы - основа. Интерфейс - фактически, абстрактный класс, в котором не реализован ни один метод и нет полей. То что ты не используешь приёмы ООП, не значит, что они не нужны. Инверсию зависимости, к примеру. Или абстрактные фабрики. Можно. Но абстрактный базовый автомобиль - это если есть что-то кроме абстрактных методов. Интерфейс - когда одни методы, и все абстрактные. Кстати, можно сделать интерфейс ТоЧтоЕздит, сделать в нём методы ехать, стоять и т.п., и после этого сделать автомобили, трамваи и прочие транспортные средства. Возможно, в каком-то контексте будет всё равно, что заставлять ехать/стоять, автомобиль или трамвай, и тогда можно рассчитывать просто на интерфейс. Ну ты как раз об этом и писал. К тому же, в PHP нельзя наследоваться от нескольких классов, но можно реализовать несколько интерфейсов (ты, конечно, это знаешь, но чтоб было для людей)
Упрощённый пример использования интерфейсов в текущем проекте. Мне надо оперировать сущностями с динамическим набором свойств, которые к тому же определяются пользователем. И эту всю фигню надо извлекать из базы данных, по разному сортировать и т.п. Но как бы это всё не было отсоритровано, отфильтровано и т.п., собственно код, отвечающий за извлечение из базы строк и расфасовки их по объектам не меняется. Поэтому я делаю так: PHP: interface StorageFilter { public function filter(Builder $query); // Builder - это Query Builder из Laravel } class EntityStorage { public function readEntities(StorageFilter $filter = null) { $query =\DB::table("entityTable"); // Создаёт построитель запроса по определённой таблице if ($filter) { $filter->filter($query); } $results = $query->get()->all(); /* Логика преобразования всего полученного в объекты моих классов */ } } $storage = new EntotyStorage; $entities = $storage->readEntities(new PropertyValueFilters($_GET["filter"])); $entities = $storage->readEntities(new CreatedBetween($date1, $date2)); // А тут паттерн "композит", собираем вместе сколько угодно разных условий $entities = $storage->readEntities(new QueryModifiersCollector([ new PropertyValueFilters($_GET["filter"]), new CreatedBetween($date1, $date2), new OwnerIs(\Auth::user()) ]); Конкретные реализации фильтров должны быть понятны по названию. И это ещё не конгфу, можно наверное было бы и круче сделать
@mkramer не соглашусь. Даже в ООП если сам себе хозяин, от интерфейсов толку 0 --- Добавлено --- @t1grok я смотрел, читал, и так и не нашел суть интеров --- Добавлено --- 5 или 16 строке ошибка
Я же привёл пример, из реального проекта. К тому же, если у меня интерфейс, я могу отнаследоваться от любого класса, и одновременно реализовать интерфейс. Мне это напоминает ситуацию в детстве, когда я уже освоил Turbo Pascal, а мой знакомый только BASIC. И он увидел у меня строк 100 интерфейсной части модуля, и давай спрашивать: а эта строчка что делает? А эта? И был удивлён, что из 50 строк ни одна не делала реальной работы
Зависит от проекта. Много чего толку ноль, когда что-то мелкое делаешь. Многие вещи только замедляют и усложняют разработку если проект не дорос до них. Но, с определенного момента, проект это перерастает. Сегодня ты сам себе хозяин. А завтра ты нанял помощника себе. И понеслась... А так, можно и про ООП говорить, что оно никому не нужно. Потому что когда делаешь что-то мелконькое, ООП больше мешает, чем помогает. Будет у тебя либо куча статики, либо одноразовых классов, по одному объекту на каждый за вызов, не более. И генераторы не нужны. И анонимные функции не нужны. И тд. Ничего не нужно. Но вот однажды напарываешься на ситуацию, когда вот что-то из такого "не нужного" является единственным правильным решением твоей проблемы. Инструментария много. И у каждого своя применимость. Если ситуация, когда инструмент нужен не наступила, это не значит, что он не нужный в принципе никому никогда.
Нигде. Не ОО-программы обычно быстрее и меньше памяти занимают, там где это критично очень, там ОО не пишут (в коде операционных систем, к примеру). ОО даёт преимущество, что меньше кода, меньше связанность (если всё правильно делать), легче сопровождать и дополнять (опять же, если удалось всё сделать правильно), но за это всё расплата - снижение в целом производительности. В том же моём примере запрос строится проходя через несколько уровней моего кода и фреймворка, понятно, что если его сразу написать в строке, будет быстрее и меньше памяти. Но зато я получаю большую гибкость. Как один лектор говорил, что при крупной системе легче железку докупить, чем разбираться в хорошо оптимизированной, но нечитаемой программе
Ну обосрусь, тогда буду дальше учить и разбирать непонятные для меня темы Если сильно захотеть, можно в космос полететь)
Других критериев нет? Эти вот наследования, оверрайды, неймспейсы, инстанцирование, трейты, разные уровни абстракций, модификаторы доступа, это вот все по-твоему для выигрывания по использованию памяти было сделано? Не для упрощения построения сложных архитектур? Не для расширения понятия "повторно используемый код" на уровень выше функций? Не для грамотного структурирования кода? Не для возможности построения "умных" интерфейсов? Не для модульности? Не для дополнительного слоя абстракции? Не для удобства поддержки и расширения?
нет нет тупо интерфейсы для создания правил чтобы внедряли свои плюшки программисты. Одним словом - маска. Макияж для женщин --- Добавлено --- вот именно, всеголишь... на большее не даны. Ничего не выдают ( кроме подзатылника инстанце бла бла ), нигде ничего не хранят, ничего не творят, доп трата на подключение на ничто. --- Добавлено --- предпочтение отдам лишь текучим https://habrahabr.ru/post/170019/