micromax 发表于 2017-4-3 11:35:13

【转】PHP通过接口实现多重继承

  PHP类虽然是单继承的,但是可以通过其它特殊的方式实现多重继承,比如使用接口实现,只要把类的特征抽象为接口,并通过实现接口的方式让对象有多重身 份,通过这样就可以模拟多重继承了。
  
下面就是一个用接口模拟多重继承的例子,源代码如下:

[*]<?  
[*]interface UserInterface{ // 定义User的接口  
[*] function getname();  
[*]}  
[*]interface TeacherInterface{ //teacher 相关接口  
[*] function getLengthOfService();  
[*]}  
[*]class User implements UserInterface { // 实现UserInterface接口  
[*] private $name = "tom";  
[*] public function getName(){  
[*]  return $this->name;  
[*] }  
[*]}  
[*]class Teacher implements TeacherInterface { // 实现TeacherInterface接口  
[*] private $lengthOfService = 5; // 工 龄   
[*] public function getLengthOfService(){  
[*]  return $this->lengthOfService;  
[*] }  
[*]}  
[*]// 继承自User类,同时实现了 TeacherInterface接口.  
[*]class GraduateStudent extends User implements TeacherInterface {  
[*] private $teacher ;  
[*] public function __construct(){  
[*]  $this->teacher = new Teacher();    
[*] }   
[*] public function getLengthOfService(){  
[*]  return $this->teacher->getLengthOfService();  
[*] }  
[*]}  
[*]class Act{  
[*] //注意这里的类型提示改成了接口类型  
[*] public static function getUserName(UserInterface $_user){  
[*]  echo "Name is " . $_user->getName() ."<br>";  
[*] }  
[*] //这里的类型提示改成了 TeacherInterface类型.  
[*] public static function  getLengthOfService(TeacherInterface $_teacher){  
[*]  echo "Age is " .$_teacher->getLengthOfService() ."<br>";  
[*] }  
[*]}  
[*]$graduateStudent = new GraduateStudent();  
[*]Act::getUserName($graduateStudent);  
[*]Act::getLengthOfService($graduateStudent);  
[*]//结果正如我们所要的,实现了有多重身份的一个对象.  
[*]?> 
  
示例运行结果如下:
  Name is tom
  Age is 5
页: [1]
查看完整版本: 【转】PHP通过接口实现多重继承