Подтвердить что ты не робот

Возможно ли иметь интерфейс с частными/защищенными методами?

Возможно ли в PHP 5 иметь интерфейс с частными/защищенными методами?

Сейчас у меня есть:

interface iService
{
    private method1();
}

Это вызывает ошибку:

Ошибка анализа: ошибка синтаксиса, неожиданный T_STRING, ожидающий T_VARIABLE

Я просто хочу получить подтверждение, что в этом случае интерфейс может содержать только общедоступные методы.

4b9b3361

Ответ 1

В справочной странице PHP о интерфейсах явно указано:

Все методы, объявленные в интерфейсе должны быть общедоступными, это характер интерфейс.

Я думаю, это объясняет ошибку, которую вы получаете; -)

Ответ 2

Интерфейсы используются для описания общедоступных методов класса, реализующего этот интерфейс. У вас никогда не будет частного метода в интерфейсе. Предполагается, что любые методы в интерфейсе используются и не должны быть изменены.

Interfaces является ссылкой на PHP, но это стандартно для программирования OO.

Ответ 3

В общем, интерфейс может иметь только публичные элементы, так как единственная функция интерфейса должна быть унаследована.

Из учебника PHPfreaks.com:

PHP5 имеет интерфейсы. Не быть путают с интерфейсами в более общий смысл, ключевое слово интерфейса создает объект, который можно использовать для обеспечить общий интерфейс классы без их расширения как с абстрактными классами. Вместо этого интерфейс реализован.

Интерфейсы отличаются от абстрактных классы. Во-первых, theyre на самом деле классы. Они не определяют свойства, и они не определяют никакого поведения. Методы, объявленные в интерфейсе должны быть объявлены в классах, которые реализовать его.

Поскольку интерфейс больше общий смысл - это определение того, как объект взаимодействует с другим кодом, все методы должны быть объявлены общедоступными (см. раздел о видимости в этом глава). Используя абстрактные классы, абстрактный метод может иметь любой видимость, но расширяющиеся классы должны использовать их реализации ту же (или более слабую) видимость. Внедрение интерфейса добавляет методы как абстрактные методы для предметный класс, неспособность его реализовать приведет к ошибке, например, следующее:

Неустранимая ошибка: класс SomeConcreteClass содержит n абстрактных методов (методов) и должен поэтому должны быть объявлены абстрактными или реализовать оставшиеся методыYes, абстрактные классы могут реализовывать интерфейсы.

Ответ 4

Интерфейсы

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

interface T {
  public /*int*/ function f(array $a);
}
interface U {
  public /*T*/ function g(T $t);
}

class C implements U {
    public function g(T $t) {
        ...
        $x = $t->f();
        ...
    }
}
Интерфейсы

полезны, потому что они описывают, ну, интерфейсы объектов. как объекты общаются со своей средой.

теперь скажем, T::f можно объявить приватным. как это было бы полезно для других объектов? он не будет вызываться извне, он не будет частью его интерфейса.

Ответ 5

Во многих случаях определение интерфейса помогает другим модулям гарантировать поведение и api класса, в этом случае что-то личное, к которому другие модули не могут получить или просто понять. Вот почему вы никогда не можете использовать частные методы для интерфейса.