>백엔드 개발 >PHP 튜토리얼 >PHP에서 다중 상속을 시뮬레이션하는 방법

PHP에서 다중 상속을 시뮬레이션하는 방법

不言
不言원래의
2018-07-05 10:55:261955검색

이 글은 주로 PHP에서 시뮬레이션 다중 상속을 구현하는 방법을 소개합니다. 이제는 모든 사람과 공유합니다. 도움이 필요한 친구들은 이를 참조할 수 있습니다.

PHP에서 시뮬레이션 다중 상속을 구현하는 방법

1.

한 문장 요약: 사실 다른 사람에게서 상속을 받으면 다른 사람의 클래스에 있는 메서드와 속성도 호출하고 싶기 때문에 이렇게 하면 됩니다. 이 클래스에서 대상 클래스의 개체를 만든 다음 메서드와 속성을 호출하면 됩니다. 이 객체를 통한 속성은 상속보다 더 편리합니다.

2. 매직 메소드 __call은 시뮬레이션된 다중 상속을 구현합니다

1. 관련 지식

PHP에는 다중 상속 기능이 없습니다. 다중 상속을 지원하는 프로그래밍 언어에서도 이 기능을 거의 사용하지 않습니다. 대부분의 사람들은 다중 상속이 좋은 설계 방법이 아니라고 생각합니다. 클래스에 추가 기능을 추가하려는 경우 상속을 사용할 필요가 없습니다. 여기에서는 참조용으로 다중 상속을 시뮬레이션하는 방법을 제공합니다.

PHP에는

__call이라는 마법의 메서드가 있습니다. 존재하지 않는 메소드를 호출하면 이 메소드가 자동으로 호출됩니다. 이 시점에서 호출을 기존 메서드로 리디렉션할 수 있는 기회가 있습니다. 여러 부모 클래스를 상속받은 하위 클래스의 경우 메서드를 찾는 과정은 일반적으로 다음과 같습니다.

자신의 메서드 -> 부모 클래스 1의 메서드 -> 부모 클래스 2의 메서드...

시뮬레이션 프로세스는 대략 다음과 같습니다.

각 상위 클래스를 인스턴스화한 다음 이를 하위 클래스의 속성으로 사용합니다. 이러한 상위 클래스는 일부 공개 메소드를 제공합니다. 하위 클래스에 메서드가 있으면 __call() 함수가 호출되지 않습니다. 이는 상위 클래스의 메서드를 "재정의"하는 것과 같습니다. 존재하지 않는 메소드가 호출되면 __call() 메소드를 사용하여 상위 클래스에서 차례로 호출할 수 있는 메소드를 찾습니다. 이것이 완전한 다중 상속은 아니지만 문제를 해결하는 데 도움이 될 수 있습니다.

 1 <?php 
 2 class Parent1 { 
 3     function method1() {} 
 4     function method2() {} 
 5 } 
 6 class Parent2 { 
 7     function method3() {} 
 8     function method4() {}
 9 }
 10 class Child {
 11     protected $_parents = array();
 12     public function Child(array $parents=array()) {
 13         $_parents = $parents;
 14     }
 15      
 16     public function __call($method, $args) {
 17         // 从“父类"中查找方法
 18         foreach ($this->_parents as $p) {
 19             if (is_callable(array($p, $method))) {
 20                 return call_user_func_array(array($p, $method), $args);
 21             }
 22         }
 23         // 恢复默认的行为,会引发一个方法不存在的致命错误
 24         return call_user_func_array(array($this, $method), $args);
 25     }
 26 }
 27 $obj = new Child(array(new Parent1(), new Parent2()));
 28 $obj->method1();
 29 $obj->method3();

여기에 관련된 속성 상속은 없지만 구현하기 어렵지 않습니다. 속성 상속은 __set() 및 __get() 매직 메서드를 통해 시뮬레이션할 수 있습니다. 직접 실천해 보시기 바랍니다.

기타 방법: 인터페이스를 통해 다중 상속 구현

PHP의 클래스는 하나의 상위 클래스만 상속할 수 있습니다. 여러 클래스를 상속하려면 인터페이스

인터페이스를 사용하여 다중 상속을 시뮬레이션해야 합니다

3. PHP 인터페이스를 통해

PHP 인터페이스에서는 인터페이스가 인터페이스를 상속받을 수 있습니다. PHP 클래스는 하나의 상위 클래스(단일 상속)만 상속할 수 있지만 인터페이스는 클래스와 다릅니다.

인터페이스는 다중 상속을 구현할 수 있으며 하나 이상의 인터페이스를 상속할 수 있습니다. 물론, 인터페이스 상속도 확장 키워드를 사용합니다. 여러 인터페이스를 상속하려면 상속된 인터페이스를 쉼표로 구분하면 됩니다. 인터페이스가 다른 인터페이스를 상속하는 경우 상위 인터페이스의 정적 상수 속성과 추상 메서드

를 직접 상속하므로 클래스

는 인터페이스를 구현할 때 관련된 모든 추상 메서드 를 구현해야 합니다. 이제 PHP 인터페이스 상속에 대해 어느 정도 이해하셨습니다. 다음 예제는 참조용입니다.

<?php 
interface father{ 
function shuchu(); 
}  
interface fam extends father{ 
function cook($name); 
}  
class test implements fam{ 
function shuchu(){ 
echo "接口继承,要实现两个抽象方法"; 
echo "<br>"; 
}  
function cook($name){ 
echo "平时经常做饭的人是:".$name;  
}  
}  
$t=new test(); 
$t->shuchu(); 
$t->cook("妈妈");  
?>

코드 실행 결과는 다음과 같습니다.

인터페이스 상속에는 두 가지 추상 메서드가 필요합니다. 일반적으로 요리하는 사람은: 엄마위의 예는 인터페이스가 인터페이스를 상속하므로 테스트 클래스가 fam 인터페이스를 구현할 때 두 개의 추상 메서드, 즉 인터페이스의 하위 클래스를 인스턴스화해야 한다는 것입니다. 상위 클래스 메소드의 추상화는 모두 인스턴스입니다.


인터페이스 다중 상속의 예를 살펴보겠습니다. 코드는 다음과 같습니다.

<?php 
interface father{ 
function shuchu(); 
} 
interface mother{ 
function dayin($my); 
} 
interface fam extends father,mother{ 
function cook($name); 
} 
class test implements fam{ 
function dayin($my){ 
echo "我的名字是:".$my;  
echo "<br>"; 
} 
function shuchu(){ 
echo "接口继承,要实现两个抽象方法"; 
echo "<br>"; 
} 
function cook($name){ 
echo "平时经常做饭的人是:".$name;  
} 
} 
$t=new test(); 
$t->shuchu(); 
$t->dayin("小强");  
$t->cook("妈妈");  
?>

실행 결과 예:

두 가지 추상 메소드를 구현하는 인터페이스 상속제 이름은 Xiaoqiang요리를 주로 하는 사람입니다. 예: 엄마 인터페이스는 두 개의 인터페이스를 상속하므로 이 코드는 모든 인스턴스 중에 이 세 가지 추상 클래스의 모든 추상 메서드를 인스턴스화해야 합니다. 이 두 예제를 읽고 나면 인터페이스 상속에 익숙해질 것입니다. 실제로 관련된 모든 추상 메서드가 구현되는 한 단일 상속과 다중 상속이 있습니다.



위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

PHP prepare에서 mysqli 전처리

PHP 다중 프로세스 프로그래밍에 대한 초기 소개

PHP 다형성의 이해

위 내용은 PHP에서 다중 상속을 시뮬레이션하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.