面向对象:封装继承多态
继承
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弱类型语言不支持多态