Может ли класс расширить как класс, так и реализовать интерфейс - PullRequest
86 голосов
/ 17 марта 2009

Может ли класс расширить как интерфейс, так и другой класс в PHP?
В основном я хочу сделать это:

interface databaseInterface{
 public function query($q);
 public function escape($s);
 //more methods
}

class database{ //extends both mysqli and implements databaseInterface
 //etc.
}

Как можно это сделать, просто делая:

class database implements databaseInterface extends mysqli{ 

приводит к фатальной ошибке:

Parse error: syntax error, unexpected T_EXTENDS, expecting '{' in *file* on line *line*

Ответы [ 3 ]

153 голосов
/ 17 марта 2009

Попробуйте наоборот:

class database extends mysqli implements databaseInterface { ...}

Это должно работать.

17 голосов
/ 17 марта 2009

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

class database extends mysqli implements databaseInterface { ... }

Кроме того, класс может реализовывать более одного интерфейса. Просто разделите их запятыми.

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

Вместо этого я бы посоветовал делать вещи, связанные с БД, способом mysqli (или способом PDO).

Плюс, второстепенная вещь, но соглашения об именах имеют значение. Ваш класс database кажется более общим, чем mysqli, поэтому он предполагает, что последний наследует от database, а не наоборот.

3 голосов
/ 12 сентября 2015

Да, на самом деле, если вы хотите реализовать несколько интерфейсов, вы можете сделать это так:

public class MyClass extends BaseClass implements myInterface1, myInterface2, myInterface3{ 

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