Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Access level против Интерфейсов


Автор: Dima 2015 29.9.2008, 12:39
Вот такой простой код:

Код

interface TestInterface {
    
    private function f1();

}

class Test implements TestInterface {
    
    private function f1() {
        echo 'f1';
    }
}


Выдает ошибку:

Fatal error: Access type for interface method TestInterface::f1() must be omitted in D:\Project\Dima\interface.php on line 5

Меняем на:

Код

interface TestInterface {
    
    public function f1();

}

class Test implements TestInterface {
    
    private function f1() {
        echo 'f1';
    }
}


И имеем:

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, а как ты считаешь для чего нужны интерфейсы?

Автор: skyboy 29.9.2008, 13:24
Цитата(Dima 2015 @  29.9.2008,  11:39 Найти цитируемый пост)
Access type for interface method TestInterface::f1() must be omitted

Цитата

Тип доступа для метода TestInterface::f1() должен быть пропущен

Я могу понять незнание английского языка и нежелание ознакомиться с ним хотя бы на уровне чтения документации. но игнорирование большого количества автоматизированных переводчиков я понять никак не могу.

Автор: Dima 2015 29.9.2008, 14:11
yurik_l, вот именно этот вопрос у меня и возник когда напоролся на эти ошибки.


skyboy, не, я как раз все перевел и документацию смотрел, иначе бы сюда не полез smile

Ну пропущу я доступ для метода, напишу интерфейс так:

Код

interface TestInterface {
    
    function f1();

}

class Test implements TestInterface {
    
    private function f1() {
        echo 'f1';
    }
}


Будет та же самая ошибка.

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
Цитата(xoma @  29.9.2008,  15:58 Найти цитируемый пост)
Мне кажется все вполне логично.

однако, интерфейсы вполне можно использовать не только для реализации полиморфизма, но и для контроля работы программиста: так же, как и абстрактные классы, чтоб заставить программиста в классах-потомках чего-то там обязательно реализовывать некий функционал. с отличием, что интерфейсы допускают множественное наследование. в этом случае лично мне кажется вполне логичным использование модификаторов доступа. или наоборот - опускание модификатора доступа. к примеру, если для private-реализации ещё есть конфликт: в потомках методы, объявленные в интерфейсе, станут нереализованными и это надо контролировать, то вот почему нельзя сделать методы protected - мне не ясно. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)