【www.gdgbn.com--面向对象编程】

在php中不支持多重继承,如果我们向使用多个类的方法而实现代码重用有什么办法么?那就是组合。在一个类中去将另外一个类设置成属性。

下面的例子,模拟了多重继承。

view sourceprint?01

02 class user { 

03     private $name = "tom"; 

04     public function getname(){ 

05         return $this->name; 

06     } 

07 } 

08 class teacher{ 

09     private $lengthofservice = 5; // 工龄  

10     public function getlengthofservice(){ 

11         return $this->lengthofservice; 

12     } 

13 } 

14 // 上面的类中的set方法就不写了. 

15 // 如果有个研究生,既是学生也算工龄.  

16 class graduatestudent extends user { 

17     private $teacher ; 

18     public function __construct(){ 

19         $this->teacher = new teacher();       

20     }    

21     public function getlengthofservice(){ 

22         return $this->teacher->getlengthofservice(); 

23     } 

24 } 

25 $graduatestudent = new graduatestudent(); 

26 echo "name is ".$graduatestudent->getname()."
"; 

27 echo "lengthofservice is ".$graduatestudent->getlengthofservice(); 

28   

29 ?> 

 

 

程序运行结果:

view sourceprint?1 name is tom 

2 lengthofservice is 5

不完全的多重继承
上面的例子是多重继承么?

我们继续运行下面的代码。

view sourceprint?01

02 class user{ 

03     private $name = "tom"; 

04     public function getname(){ 

05         return $this->name; 

06     } 

07 } 

08 class teacher{ 

09     private $lengthofservice = 5; // 工龄  

10     public function getlengthofservice(){ 

11         return $this->lengthofservice; 

12     } 

13 } 

14 class graduatestudent extends user { 

15     private $teacher ; 

16     public function __construct(){ 

17         $this->teacher = new teacher();       

18     }    

19     public function getlengthofservice(){ 

20         return $this->teacher->getlengthofservice(); 

21     } 

22 } 

23 class act{ 

24     public static function getusername(user $_user){ 

25         echo $_user->getname(); 

26     } 

27     public static function  getlengthofservice(teacher $_teacher){ 

28         echo $_teacher->getlengthofservice(); 

29     } 

30 } 

31 $graduatestudent = new graduatestudent(); 

32 act::getusername($graduatestudent); 

33 act::getlengthofservice($graduatestudent); 

34   

35 ?>

程序运行结果:

view sourceprint?1 tom 

2 catchable fatal error: argument 1 passed to act::getlengthofservice() must be an instance of teacher, instance of graduatestudent given, called in e:phpprojects owamagicphp-8-2.php on line 34 and defined in e:phpprojects owamagicphp-8-2.php on line 28

我们并不能将$graduatestudent代表的实例当作teacher类型传入。

这样的多重继承是失败的,没有多重身份,怎么能叫多重继承呢?

使用接口实现多重继承
通过把类的特征抽象为接口,并通过实现接口的方式让对象有多重身份,自然就可以完全模拟多重继承了。

view sourceprint?01

02 interface userinterface{ //定义user的接口 

03     function getname(); 

04 } 

05 interface teacherinterface{ //teacher相关接口 

06     function getlengthofservice(); 

07 } 

08 class user implements userinterface { //实现userinterface接口 

09     private $name = "tom"; 

10     public function getname(){ 

11         return $this->name; 

12     } 

13 } 

14 class teacher implements teacherinterface { //实现teacherinterface接口 

15     private $lengthofservice = 5; // 工龄  

16     public function getlengthofservice(){ 

17         return $this->lengthofservice; 

18     } 

19 } 

20 // 继承自user类,同时实现了teacherinterface接口. 

21 class graduatestudent extends user implements teacherinterface { 

22     private $teacher ; 

23     public function __construct(){ 

24         $this->teacher = new teacher();       

25     }    

26     public function getlengthofservice(){ 

27         return $this->teacher->getlengthofservice(); 

28     } 

29 } 

30 class act{ 

31     //注意这里的类型提示改成了接口类型 

32     public static function getusername(userinterface $_user){ 

33         echo "name is " . $_user->getname() ."
"; 

34     } 

35     //这里的类型提示改成了teacherinterface类型. 

36     public static function  getlengthofservice(teacherinterface $_teacher){ 

37         echo "age is " .$_teacher->getlengthofservice() ."
"; 

38     } 

39 } 

40 $graduatestudent = new graduatestudent(); 

41 act::getusername($graduatestudent); 

42 act::getlengthofservice($graduatestudent); 

43 //结果正如我们所要的,实现了有多重身份的一个对象. 

44 ?>

程序运行结果:

view sourceprint?1 name is tom 

2 age is 5

本文来源:http://www.gdgbn.com/jsp/25731/