• php 继承


    说多重继承之前首先说下与其相对的单一继承,单一继承指的是一个类只可以继承自一个父类,从现实生活中举例就是说一个儿子只有一个父亲。那么多重继承就好理解了,多重继承指的是一个类可以同时从多于一个父类继承行为与特征的功能。这个有逆常理,即一个儿子可以有多个父亲。由于多重继承是面向对象编程语言中所特有的特性,所以在php5之前是没有什么继承这一说了。但在php中,即使php5也只是实现了单继承。但是我们可以通过其它特殊的方式实现类的多重继承,比如使用接口(interface),只要把类的特征抽象为接口,并通过实现接口的方式让对象有多重身份,通过这样就可以在php中模拟多重继承了。

    下面通过一个实例来说明一下如何在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

    另外不得不说明的一下是多重继承在实际开发中会增加程式的复杂性与含糊性,非常不利于代码的调试。所以在开发中能够想办法用单继承的来实现的东西最好避免使用多重继承。

  • 相关阅读:
    Scheduler踩坑记录
    关于RedisTemplate的map存储踩坑记录
    关于HashMap的加载因子相关理解
    Mybatis 分页插件PageHelper 遇坑
    Linux 下 Mysql忘记密码重置
    Eclipse MAT和jvisualvm分析内存溢出
    使用jdk自带工具jvisualvm 分析内存dump文件
    EUREKA 删除 or 强制下线/上线 实例
    Idea 远程调试jenkins 项目
    spring 事务传播行为类型
  • 原文地址:https://www.cnblogs.com/youxianyen/p/6025985.html
Copyright © 2020-2023  润新知