За последние 24 часа нас посетили 34117 программистов и 1709 роботов. Сейчас ищут 739 программистов ...

Интерфейсы

Тема в разделе "PHP для новичков", создана пользователем Greg1978, 16 дек 2008.

  1. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Доброе утро Всем!
    Никак немогу понять для чего нужны интерфейсы в ООП, если их можно заменить обычным классом, или это не так.
    Если есть код, который описывает НУЖНОСТЬ интерфейса, выложите пожалуйста или дайте ссылку.
    Спасибо!
     
  2. free-bits

    free-bits Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    296
    Симпатии:
    0
    Адрес:
    г. Красноярск
  3. Frozen

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

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    интерфейс не пхпшная фишка. Толку от него минимально
     
  4. Интерфейс фишка ООП. То что никто из вас не умеет им думать и пользоваться — ваша проблема, а не ПХП.
     
  5. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Вот и я об этом хотелось бы пример обоснованного применения. :D
     
  6. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    free-bitsЯ это понимаю, не понять что мешает использовать класс со статическими функциями например, вместо нескольких интерфейсов!?
     
  7. Я не о интерфейсах, а о ООП.
    Научитесь нормально пользоватся ООП, и у вас не возникнут такие вопросы.
     
  8. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Greg1978
    Например, систему разрабатывает два человека. Один пишет одну часть, другой - другую. Им нужно договориться, как написанные ими классы будут взаимодействовать, грубо говоря какие у них будут методы и с какими параметрами. Они обмениваются интерфейсами и пишут себе раздельно. А потом (по идее!! :)) они подключают готовые классы в приложение и все начинает работать.
     
  9. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Dagdamor
    Бред…
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Я не пользуюсь интерфейсами.
    Ps/ Жизнь прекрасна...
     
  11. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Dagdamor
    А почему нельзя использовать, опять же, класс со статическими функциями или их нельзя перекрывать в наследуемых классах?
     
  12. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    +1 Я тоже поддерживаю, просто интересно для чего такой аппендицит придумали, значит нужен был ....
     
  13. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    AlexGousev
    Слив...
     
  14. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Greg1978
    При чем тут статические функции? Можно и обычными, их можно будет перекрывать, но дело даже не в возможности наследования, а в том, что PHP за тебя будет контролировать корректность описания класса, его соответствие "трафарету". При написании класса указываешь, что он имплементирует некий интерфейс (т.е. соответствует ему). И все. Либо ты напишешь класс как надо, либо он приведет к ошибке интерпретации. Опять же это все в теории. На практике все сложнее :)
     
  15. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Короче интерфейс позволяет стандартизировать все функции. Интерфейс -- это краткий мануал по классу. Я прав?
     
  16. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Kreker
    Интерфейс - это не то что мануал, он же не показывает смысла и деталей... это скорее некое соглашение, договоренность. Поэтому они удобны для командной разработки. Если же над проектом работает один человек - то интерфейсы действительно пятое колесо и редко когда полезны.
     
  17. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    И кстати вдогонку к free-bits и его ссылке.
    Это неверно, интерфейсы ничего общего с абстрактными классами не имеют, интерфейсы - это интерфейсы, а классы это классы. К примеру, любой класс, даже абстрактный, может имплементировать интерфейс или даже несколько. Обратной же связи - нет.
     
  18. Frozen

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

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    класс это тип данных, который будет использовать метод. Интерфейс это тоже тип данных, такой же как класс, тока без кода внутри. Он просто помогает выстроить определённую структуру приложения, посмотреть "а возможно ли так", и набить ее кодом.
     
  19. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Всё спасибо, разобрался!!! :)
    Кстати, они очень хорошо подходят для функциональности и одному разработчику.
    Они обеспечивают, оказывается общую платформу для разных обьектов что не могут сделать классы.
    И если передавать их(обьекты) в ф-ию строго по типу интерфейса, то и доступны только его методы, а не класса.
    Спасибо Вам всем!!!
     
  20. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. interface Vehicle {
    3.     public function drive();
    4. }
    5.  
    6. abstract class Car implements Vehicle {
    7. }
    8.  
    9. class Nissan extends Car {
    10.     public function drive() {/* */}
    11. }
    А можно написать так
    PHP:
    1. <?php
    2. interface Vehicle {
    3.     public function drive();
    4. }
    5.  
    6. interface Car extends Vehicle {
    7. }
    8.  
    9. class Nissan implements Car {
    10.     public function drive() {/* */}
    11. }
    И результат будет одним.
     
  21. Неверно.
    Неверно.
    Частично.
     
  22. Frozen

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

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    мб некорректно выразился, но описать в 2 словах нереально
     
  23. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Абстрактный класс я использую только тогда, когда знаю, что в нём должна быть заложена какая-то общая функциональность для нескольких классов, в противном случае я использую интерфейс.

    Кстати, в php есть возможность задать имя класса или интерфейса, которые ожидаешь в методе, что освобождает от ручной проверки соответствия типу.

    PHP:
    1. <?php
    2. interface Engine {
    3.     // ...
    4. }
    5.  
    6. abstract class Car implements Vehicle {
    7.     public function setEngine(Engine $engine) {
    8.         $this->engine = $engine;
    9.     }
    10. }
    После этого, я уверен, что получу то, что мне нужно.
     
  24. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Вот при этой передаче экземпляра в ф-ию будут доступны только методы описанные в интерфейсе, в данном случае Engine?Типа $engine->..... А другие методы этого экземпляра не входящие в определение интерфейса, но входящие в состав класса экземпляра тогда не будут доступны?
     
  25. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Доступны все методы, но гарантированно только методы, которые объявлены в интерфейсе Engine.