Доброе утро Всем! Никак немогу понять для чего нужны интерфейсы в ООП, если их можно заменить обычным классом, или это не так. Если есть код, который описывает НУЖНОСТЬ интерфейса, выложите пожалуйста или дайте ссылку. Спасибо!
Интерфейс фишка ООП. То что никто из вас не умеет им думать и пользоваться — ваша проблема, а не ПХП.
free-bitsЯ это понимаю, не понять что мешает использовать класс со статическими функциями например, вместо нескольких интерфейсов!?
Я не о интерфейсах, а о ООП. Научитесь нормально пользоватся ООП, и у вас не возникнут такие вопросы.
Greg1978 Например, систему разрабатывает два человека. Один пишет одну часть, другой - другую. Им нужно договориться, как написанные ими классы будут взаимодействовать, грубо говоря какие у них будут методы и с какими параметрами. Они обмениваются интерфейсами и пишут себе раздельно. А потом (по идее!! ) они подключают готовые классы в приложение и все начинает работать.
Dagdamor А почему нельзя использовать, опять же, класс со статическими функциями или их нельзя перекрывать в наследуемых классах?
Greg1978 При чем тут статические функции? Можно и обычными, их можно будет перекрывать, но дело даже не в возможности наследования, а в том, что PHP за тебя будет контролировать корректность описания класса, его соответствие "трафарету". При написании класса указываешь, что он имплементирует некий интерфейс (т.е. соответствует ему). И все. Либо ты напишешь класс как надо, либо он приведет к ошибке интерпретации. Опять же это все в теории. На практике все сложнее
Короче интерфейс позволяет стандартизировать все функции. Интерфейс -- это краткий мануал по классу. Я прав?
Kreker Интерфейс - это не то что мануал, он же не показывает смысла и деталей... это скорее некое соглашение, договоренность. Поэтому они удобны для командной разработки. Если же над проектом работает один человек - то интерфейсы действительно пятое колесо и редко когда полезны.
И кстати вдогонку к free-bits и его ссылке. Это неверно, интерфейсы ничего общего с абстрактными классами не имеют, интерфейсы - это интерфейсы, а классы это классы. К примеру, любой класс, даже абстрактный, может имплементировать интерфейс или даже несколько. Обратной же связи - нет.
класс это тип данных, который будет использовать метод. Интерфейс это тоже тип данных, такой же как класс, тока без кода внутри. Он просто помогает выстроить определённую структуру приложения, посмотреть "а возможно ли так", и набить ее кодом.
Всё спасибо, разобрался!!! Кстати, они очень хорошо подходят для функциональности и одному разработчику. Они обеспечивают, оказывается общую платформу для разных обьектов что не могут сделать классы. И если передавать их(обьекты) в ф-ию строго по типу интерфейса, то и доступны только его методы, а не класса. Спасибо Вам всем!!!
PHP: <?php interface Vehicle { public function drive(); } abstract class Car implements Vehicle { } class Nissan extends Car { public function drive() {/* */} } А можно написать так PHP: <?php interface Vehicle { public function drive(); } interface Car extends Vehicle { } class Nissan implements Car { public function drive() {/* */} } И результат будет одним.
Абстрактный класс я использую только тогда, когда знаю, что в нём должна быть заложена какая-то общая функциональность для нескольких классов, в противном случае я использую интерфейс. Кстати, в php есть возможность задать имя класса или интерфейса, которые ожидаешь в методе, что освобождает от ручной проверки соответствия типу. PHP: <?php interface Engine { // ... } abstract class Car implements Vehicle { public function setEngine(Engine $engine) { $this->engine = $engine; } } После этого, я уверен, что получу то, что мне нужно.
Вот при этой передаче экземпляра в ф-ию будут доступны только методы описанные в интерфейсе, в данном случае Engine?Типа $engine->..... А другие методы этого экземпляра не входящие в определение интерфейса, но входящие в состав класса экземпляра тогда не будут доступны?