Использование интерфейсов - PullRequest
2 голосов
/ 23 августа 2010

Просто пояснение из предыдущего вопроса об OO PHP.Я проверил на сайте php.net, но все еще не совсем уверен.Должен быть быстрый ответ, я ожидаю.

При «определении» методов в интерфейсе должен ли класс, который его реализует, использовать все перечисленные методы из интерфейса?

Пример:

interface foo {
    public function blah();
    public function de();
    public function bleh();
}

class bar implements foo {
    public function blah() {
        //Code here
    }

    public function bleh() {
        //More code here
    }
}

Будет ли это работать?

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

Нет. Класс, реализующий интерфейс , должен реализовывать все методы, определенные интерфейсом, или быть определенным как абстрактный. Если вы попытаетесь запустить скрипт без определения всех методов, вы получите

Неустранимая ошибка: панель классов содержит 1 абстрактный метод и поэтому должна быть объявлена ​​абстрактной или реализовать оставшиеся методы

Другими словами, либо выполните

abstract class bar implements foo {}

или

abstract class bar implements foo {
        public function blah() { /* code */ }
        public function bleh() { /* code */ }    
}

или оставьте некоторые методы пустыми в конкретном классе

class bar implements foo {
    public function blah() { /* code */ }
    public function bleh() { /* code */ }
    public function de() {}
}
1 голос
/ 23 августа 2010

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

Для созданных экземпляров классов они всегда должны реализовывать весь интерфейс.В этом и заключается смысл интерфейсов: вы знаете , что если $foo instanceof foointerface, то он всегда будет поддерживать все аспекты, объявленные в интерфейсе (и, следовательно, не делать ошибок или делать что-то неожиданное, когда вы делаете $bar->de() ...

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

0 голосов
/ 23 августа 2010

нет, это не сработает.когда вы пытаетесь создать экземпляр класса, вы получите ошибку.весь смысл интерфейсов состоит в том, чтобы определять функции, которые ДОЛЖНЫ быть определены в объекте instanciatet, который улучшает интерфейс.что вы МОЖЕТЕ сделать, однако, это расширить другой класс до класса, который вы уже определили, определить отсутствующую функцию и создать его экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...