封装继承多态

面向对象:封装继承多态

继承

extends,指子类通过继承可以访问父类的成员、属性,

父类:基类

子类:派生类

小结:

1.继承是利用extends进行子类和父类的关联。

2.继承利用extends关键字实现

3.继承是指实现继承关系后,子类对象可以访问父类被继承的成员,而父类对象(直接实例化得到)不可以访问之列成员(没有关系)

【有限继承】

概念:指在子类继承父类父类成员的时候,并非继承所有内容,而是继承父类的部分内容(有限能用)

php中继承的本质是对象继承

php总继承的内容:父类所有公共成员,受保护成员和私有属性,私有方法不能继承

受保护(protenced)成员是专用于继承的,可以在父类或者子类内部访问

静态成员也遵循继承规则:即子类可以访问静态成员(满足继承条件)

#父类
class Human{
	const CALL = "人";
	public static $count = 0;
	public $name = "human";
	protected $age = "120";
	private $money = "100";
	
	public function __construct($money){
			$this->money = $money;
	}
	
	public  function showName()
	{
		echo $this->name;
	}
	
	protected  function showAge()
	{
		echo $this->age;
	}
	
	private  function showMoney()
	{
		echo $this->age;
	}
	
	public  function __destruct()
	{
		echo "die";
	}
	#构造方法__construct,析构方法__destruct可以被继承
}

#子类
class Man extends{
	public function getAge()
	{
		echo	$this->age;
	  $this->showAge();
	}
	
	public function getMoney()
	{
		echo 	$this->money;    	#被继承,但无法不能被访问
	  	$this->showMoney();	#不能访问(没有继承)
	  
	  #私有属性需要父类提供接口访问,否则无法访问;
	}
}

#实例化
echo Man::$cont;#静态

$man = new Man();
var_dump($man);#证明父类所有属性确实被父类继承

$man->showAge();#无法访问,只能在子类内部访问,不可在外部访问
$man->getAge();

$man->showMoney();#无法访问,只能在子类内部访问,不可在外部访问
$man->getMoney();

【重写】

override,子类中定义了与父类重命名的成员

  • 子类可以重写父类任意成员

    • 属性:直接覆盖,父类对象的属性将不存在(私有的不会被覆盖)
    • 方法:同事存在
  • 通常重写是用来重写父类的方法,用于扩展或者更改某些业务逻辑

  • 重写要求

    • 子类对成员的控制权限不能高于父类
    • 子类重写方法时,要求与父类参数一致
    • 私有化不存在重写概念,故无上述无要求限制(本质没有被继承

【parent关键字】

定义:一种明确访问父类成员的表达方式

  • parent关键字是用于在被重写的方法(子类)中明确父类被重写成员

  • parent可以访问父类静态属性、静态方法、类常量和普通方法

  • parent适用范围解析操作符访问

    parent::父类方法();
    
    
    calss  A{
    
    	public static $level = 1;
    	public function __construct()
    	{
    		$a = 'a';
    	}
    }
    
    class  B extends A{
    	public static $level = 1;
    	public function __construct()
    	{	
    		parent::__construct();
    		#其他操作
    		$b = 'b';
    
    		echo self::$level;		#输出2
    		echo parent::$level;	#输出1
    	}
    }
    

【php的继承特点】

php只能单继承,只能有一个父类(继承多类方法:链式继承)

  • 链式继承:B extends A, C extends B

    php最初是面向过程,后来转为面向对象

php只有私有的方法不能继承(私有属性能继承不能用)

php允许构造方法、析构方法继承

【静态延迟绑定】冬天绑定

#父类
class Human{
	public static $name = "Human";
	public static function showName(){
		#静态绑定
		echo self::$name,"<br/>";		#编译时:Human::$name;
		#静态延迟绑定
		echo static::$name,"<br>";		#编译时:?::$name;
	}
}


class Man extends Human{
	# 重写父类静态属性
	public  static $name = "Man";
	
}
Human::showName();
	#Human
	#Human
#子类调用
Man::showName();
	#Human
	#Man

【最终类Final】

概念

继承多了系统解析的复杂度也随之提高。

最终类:使用final关键字修饰类名,表示此类不可以被继承,只能被直接实例化使用,保护结构不被恶意扩展和修改。

  • final除了修饰类,表示类不能被继承
  • final除了修饰方法,表示方法不能被重写
#最终类
final class Man{}

class Man18 extends Man{} #致命错误:无法从final类继承

步骤

存在继承关系

父类存在此方法,不满足子类业务要求

子类重写父类方法(或者属性)

多态

同一对象调用统一方法,因传入对象不同而返回不同结果。

Animal::show(new Cat());

Animal::show(new Dog());

【特点】

子类继承并且重写父类方法

父类对象拥有子类形态,并且表现出子类特性。(调用子类方法)

php弱类型语言不支持多态

Licensed under 京ICP备17003353号-3