Как указано в заголовке: почему каждая функция, которую вы добавляете в интерфейс, должна быть публичной?
Все методы, объявленные в интерфейсе, должны быть открытыми; это природа интерфейса
Какова природа интерфейса, как указано в приведенной выше цитате?
Как насчет того, чтобы класс реализовывал интерфейс, и другой класс, расширяющий этот класс. Почему невозможно определить методы, необходимые в классах, расширяющих основной класс?
Обратите внимание: я знаю, как использовать интерфейсы, но мне просто интересно, почему эти вещи невозможно предопределить.
На более общем (не специфичном для PHP) уровне интерфейсы предоставляют список методов, которые класс обещает сделать доступными для использования другими объектами.
Закрытый метод в интерфейсе не дает вам ничего, потому что только реализующий класс сможет использовать его. Поэтому все, что помечено как приватное, может не отображаться в интерфейсе.
Интерфейс позволяет вам определять методы без их фактической реализации, например:
public function setVariable($name, $var);
Обратите внимание на ;
в конце функции, тогда как вы обычно ставите {
с остальной частью вашего кода.
Когда класс реализует интерфейс, ожидается, что implement
все определенные методы, например:
public function setVariable($name, $var) {
//do more stuff here
}
Так что, делая один private
будет бессмысленным, так как реализующий класс не сможет получить к нему доступ.
Идея концепции интерфейсов состоит в том, чтобы отделить внешний интерфейс класса от его внутренней реализации. Он используется для обеспечения того, чтобы другие классы, использующие класс, реализующий интерфейс, действительно ожидали, что функции, которые они ожидают от него, присутствуют. Если вы хотите использовать конкретный способ реализации, вы можете использовать Абстрактные классы (http://php.net/manual/en/language.oop5.abstract.php) для этого.
Природа интерфейса состоит в том, чтобы выставлять набор поведения, поэтому он неявно общедоступен … поэтому, если он закрыт, вы не раскрываете поведение …
Functions
в Interface
должен быть публичным, иначе вы можете получить ошибки!
Пример таков:
interface A
{
private method1();
}
Вы получите ошибку, подобную этой:
Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE
Таким образом, вы должны написать публичные функции в интерфейсе!