【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