클래스가 클래스를 확장하고 인터페이스를 구현할 수 있습니까?


100

클래스가 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{ 

치명적인 오류가 발생합니다.

구문 분석 오류 : 구문 오류, 예기치 않은 T_EXTENDS, * 파일 *의 * line * 줄에 '{'가 필요합니다.

18
어떻게 너무 현지화되어 있습니까?! "이 질문은 미래의 방문자에게 도움이 될 것 같지 않습니다." 그러나 가장 좋은 답변에는 33 개의 찬성 투표와 4 개의 별표가 있습니다!
duality_ 2013

답변:


177

다른 방법으로 시도해보십시오.

class database extends mysqli implements databaseInterface { ...}

작동합니다.


아, 정말 감사합니다. 왜 그들이 반대 방향이어야 하는가?
Pim Jager

14
하나의 클래스 만 상속 할 수 있고 여러 인터페이스를 구현할 수 있기 때문에 아마도 구문 설탕 일 것입니다. 또한 하위 클래스가 인터페이스를 구현하는 경우 구현 된 메서드 목록에도 표시됩니다. 그래서 그것들을 그 순서대로 두는 것은 확실한 의미가 있습니다.
Drew

나쁜 습관입니까?
모하메드 Shamshid

21

예, 그럴 수 있습니다. 올바른 순서를 유지하기 만하면됩니다.

class database extends mysqli implements databaseInterface { ... }

또한 클래스는 둘 이상의 인터페이스를 구현할 수 있습니다. 쉼표로 구분하십시오.

그러나 mysqli 클래스확장하는 것은 엄청나게 나쁜 생각 이라고 경고 할 의무가 있다고 생각합니다. 합니다. 상속은 객체 지향 프로그래밍에서 가장 과대 평가되고 오용되는 개념 일 것입니다.

대신 db 관련 작업을 mysqli 방식 (또는 PDO 방식)으로하는 것이 좋습니다.

또한 사소한 것이지만 명명 규칙이 중요합니다. 당신의 클래스 database는 더 일반적으로 mysqli보이므로 후자가 상속되는 database것이 아니라 주위의 방법을 상속 하지 않는다고 제안합니다 .


1
mysqli 클래스를 확장하는 것이 왜 나쁜 생각입니까?
Pim Jager

11
첫째, 귀하의 것이 아니기 때문입니다. mysqli 녀석이 무언가를 변경하기로 결정하면 하위 클래스의 동작도 변경됩니다. 둘째, 상속은 추가 기능으로 EXTEND하는 것이 아니라 SPECIALIZE에 사용됩니다. 이것은 OOP에서 가장 오해 된 것입니다. 경험상 추상 클래스 만 확장하는 경향이 있습니다.
Michał Rudnicki

Michal-다형성 접근법을 사용하는 개발자와 집계 / 구성된 접근법을 사용하는 개발자에게 mysqli의 변경 사항은 어떻게 다를까요? 변경 사항을 처리하려면 여전히 코드를 업데이트해야합니다.
Peter Bailey

2
어댑터 패턴에 익숙합니다. 메서드 이름이 변경되거나 더 이상 사용되지 않는 경우에도 두 시나리오 모두에서 코드를 변경해야합니다. 이 시나리오에서는 비다 형성 접근 방식이 더 낫다는 데 동의하지만 어댑터가 변경에 대해 "면역 적"이라는 개념은 구입하지 않습니다.
Peter Bailey

2
해당 코드를 사용하는 모든 위치가 아닌 어댑터 코드 만 변경하면됩니다. 컴포지션을 사용하면 호환성 계층을 제공 할 수 있지만 상속을 사용하면 기껏해야 해킹이라고 할 수 있습니다. 그리고 나는 정정 당했다, 어댑터는 더 나은 변화에 대한 내성을 제공 할 것이다.
Michał Rudnicki

6

예, 실제로 여러 인터페이스를 구현하려면 다음과 같이 할 수 있습니다.

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

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.