Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Помогите понять интерфейсы
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
Привет форумчане! Читал мануал на оф сайте про интерфейсы, читал книгу где используются интерфейсы но не как не могу понять для чего они нужны! Интерфейс это скелет а мясо наращивает класс, но зачем нужен интерфейс??? допустим я не вижу разницы в следующем:
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
если они тебе не понадобились значит не нужны - чего напрягатся
когда наберешся опыта и будешь делать проекты посложнее тогда понадобятся
а может и нет - в PHP интерфейсы не так востребованы как в С++ bkb Офмф
Цитата:
Интерфейс это скелет а мясо наращивает класс, но зачем нужен интерфейс?
интерфейс заставляет клас реализовывать его методы
это ваажно когда например сторонний разработчик дописывает т свои класссы в системму и нужно чтобы его классы имели методы которые ситемма будет знать наперед что они у него есть неважно что внутри класс делает и откуда он взялся.
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
хотел тоже чтото написать но моя мысль свелась к следуйщему
caballero пишет:
если они тебе не понадобились значит не нужны - чего напрягатся
Ничего свехестественого они не дают, и используются редко.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Bio man
Отправлено: 25 Сентября, 2011 - 19:51:48
Постоянный участник
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
ну наследование я понел, это расширение базового класса. и как я понел интерфейс это своего рода шаблон для класса и актуален только тогда когда дополнением занимается сторонний разработчик. а как быть с множественным наследованием? читал, что класс не поддерживает множественное наследование и для решения этой проблемы используют интерфейсы. типо
я так понимаю что в классе А должны быть реализованы все методы наследованных интерфейсов?
DlTA
Отправлено: 25 Сентября, 2011 - 20:07:39
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
)) чемто костыль напоминает, типа не продумали сразу так давай теперь прикинемся трехногим
caballero
Отправлено: 25 Сентября, 2011 - 20:17:38
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
я так понимаю что в классе А должны быть реализованы все методы наследованных интерфейсов?
правильно
множественное наследование есть только в C++ из распространненных языков
в PHP5.4 появился костыыль под названием трейты
можно засунуть функцию в класс со стороны не объявляя ее в классе
в любом случае интерфейсы - механизм которым нужно уметь пользоватся
если не знаешь как пользоватся значит в твоих проектах они не нужны
обычно юзаются в сложных системмах типа фреймворков CMS и т.д.
когда будешь писать что то подобное тогда и узнаешь что таклое интерфейс и зачем он
объяснять на пальцах бесполезно
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
DlTA пишет:
)) чемто костыль напоминает, типа не продумали сразу так давай теперь прикинемся трехногим
не помог твой ответ.
Цитата:
я так понимаю что в классе А должны быть реализованы все методы наследованных интерфейсов?
вот что хочу уточнить (Добавление)
всем спасибо, все понел
Champion
Отправлено: 25 Сентября, 2011 - 20:40:39
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
К тому, что написал caballero, можно дабавить такую вещь.
Вы пишете проект и хотите предоставить сторонним разработчикам большую свободу в плане замены стандартных, разработанных Вами модулей, на ихние новые.
Допустим, у Вас есть модуль, реализованный классом А, расширяющим интерфейс I. Тогда для корректной разработке нового класса А в замен Вашему, разработчик тоже будет обязан реализовать то, что предлагает I.
Конечно, его ничто не обязывает так поступать, но это в его интересах, т.к. если он не реализует какой-нибудь из методов интерфейса, то что-то где-то может не сработать. А так разработчик четко знает, что ему надо реализовать
Bio man
Отправлено: 25 Сентября, 2011 - 20:52:53
Постоянный участник
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
ага. вот еще вопрос. в данном скрипте если стереть "implements Iterator" то ничего работать не будет, тоесть выведет пустую страницу, иначе все хорошо работает. почему так происходит?
throw new MySQLException($msg,self::INDETERMINATE_TOTAL_NUMBER);
}
return$number;
}
}//end class
?>
Champion
Отправлено: 25 Сентября, 2011 - 21:13:57
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Надо включить показ ошибок, тогда будет видно, почему. display_errors on и error_reporting E_ALL (Добавление)
А еще http://phpfaq[dot]ru/debug
Bio man
Отправлено: 25 Сентября, 2011 - 21:25:10
Постоянный участник
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
Champion пишет:
Надо включить показ ошибок, тогда будет видно, почему. display_errors on и error_reporting E_ALL (Добавление)
А еще http://phpfaq.ru/debug
без изменений. такое поведение подталкивает на мысль что интерфейс это не просто шаблон (скелет) а еще каким то образом управляет классом... ведь логично, что дочтаточно реализации поведения класса и не важно наследует класс интерфейс или нет.... если что то интерфейс Iterator это интерфейс из SPL. не чего не понимаю!
caballero
Отправлено: 25 Сентября, 2011 - 22:42:34
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
это не просто шаблон (скелет) а еще каким то образом управляет классом
никак он не управляет
Цитата:
если что то интерфейс Iterator это интерфейс из SPL
списки могут содержать элементы разных типов
соответственно итератор должен работать с разными типами
а фиг его знвет какой завтра засунут объект в список
поэтому конструкция которая выполняет итерацию имплементит интерфейс
например вы написали клас который полез в базу и вернул набор данных
вы хотите чтобы по этому набору можно было ходить итераторм - самое простое
ходить через foreach
а значит вы должные реализовать ин соответствующий интерфейс
а компилятор сгенерит код который дергает ваш класа через известные наперед методы
почему нельзя классом обойтись?
потому что разработчик компилятора понятия не иметет какие там создаст классы разработчик сайта.
конечно иногда можно использовать базовый абстрактный клас встроенный в язык и наследоватся от него
но тут два момента:
может не быть общего функционала которые есть смысл выносить в базовый клас
возможно разработчик сайта собирается использовать этот класс в какой то своей иерархии наследования
Вообще вопрос зачем интерфейсы для тех кто пишет не только в пыхе а в яве сишарпе и т.д. даже не стоит. А кто собирается писать только в пыхе с интерфейсами может встретится раз в десять лет
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
я, конечно, понимаю, что из меня программист, как из пробки - пуля)) но я даже на шарпах и яве с интерфейсами сталкивался всего пару раз, и то для написания классов, отвечающих за валидацию сертификатов, к примеру)
А в остальных случаях всегда хватало абстрактного класса, множественное наследование нигде пока не пригодилось
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.