| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Access level против Интерфейсов |
| Автор: Dima 2015 29.9.2008, 12:39 | ||||
Вот такой простой код:
Выдает ошибку: Fatal error: Access type for interface method TestInterface::f1() must be omitted in D:\Project\Dima\interface.php on line 5 Меняем на:
И имеем: Fatal error: Access level to Test::f1() must be public (as in class TestInterface) in D:\Project\Dima\interface.php on line 9 Из чего я делаю вывод, что в интерфейсах могут быть только public-методы. Возникает вопрос, вернее недоумение тем, что конструируя "скелет" класса нельзя указать какими идентификаторами доступа должны обладать его методы... Немного иная ситуация с абстрактными классами, хотя private методы там тоже нельзя предусмотреть, видать потому что они вообще не наследуются... |
| Автор: yurik_l 29.9.2008, 13:10 |
| Dima 2015, а как ты считаешь для чего нужны интерфейсы? |
| Автор: Dima 2015 29.9.2008, 14:11 | ||
| yurik_l, вот именно этот вопрос у меня и возник когда напоролся на эти ошибки. skyboy, не, я как раз все перевел и документацию смотрел, иначе бы сюда не полез Ну пропущу я доступ для метода, напишу интерфейс так:
Будет та же самая ошибка. http://www.php.net/manual/en/language.oop5.interfaces.php Где тут про это, ткни носом плиз? |
| Автор: skyboy 29.9.2008, 14:28 |
| Dima 2015, да, правда, так и получается. прости за резкость. странно, что в комментариях об этом не говорят. |
| Автор: Dima 2015 29.9.2008, 15:21 |
| skyboy, то то и оно. Ты заметь что если писать в интерфейсе public он пишет, что не "должен быть пропущен" а то, что в классе, реализующем интерфейс доступ должен быть такой же, т.е. public. Логика какая то странная... Ну и вообще странно. Если рассматривать интерфейс как "костяк" класса, то было бы очень логично что доступ к методам тоже можно жестко закрепить, чтобы при реализации там получать ошибки при попытке сделать публичным метод, который должен быть private или protected, а рельно получается что можно только методы перечислить, при чем исключительно публичные... |
| Автор: xoma 29.9.2008, 16:58 |
| Насколько мне известно интерфейс - это как раз и есть публичный интерфейс класса (описание его открытых public методов)...описывать в интерфейсе закрытые методы - нет особого смысла, так как они не входят в так называемый контракт класса (из java мира...). Мне кажется все вполне логично. |
| Автор: Dima 2015 29.9.2008, 17:57 |
| xoma, угу, уже и ссылочку нашел где это на прямую сказано... http://phpclub.ru/faq/PHP5/Interface |
| Автор: skyboy 29.9.2008, 18:25 |
однако, интерфейсы вполне можно использовать не только для реализации полиморфизма, но и для контроля работы программиста: так же, как и абстрактные классы, чтоб заставить программиста в классах-потомках чего-то там обязательно реализовывать некий функционал. с отличием, что интерфейсы допускают множественное наследование. в этом случае лично мне кажется вполне логичным использование модификаторов доступа. или наоборот - опускание модификатора доступа. к примеру, если для private-реализации ещё есть конфликт: в потомках методы, объявленные в интерфейсе, станут нереализованными и это надо контролировать, то вот почему нельзя сделать методы protected - мне не ясно. |