开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第二阶段:Parent 关键字】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/712/detail/12694
Parent 关键字
主要内容:
一、概念
二、步骤
三、示例
可以重写子类和重写父类,重写了父类后发现子类只会调用自己的想让父类被重写后能够再次被访问的方式就要用到 parent 关键字,所有本章的目标就是理解重写后的访问原理实现 parent 实现被重写的父类成员的访问。一般情况下,成员属性被重写后就会被覆盖。
一、概念
1.Parent 关键字是一种明确访问父类成员的表达方式,parent 关键字用于再被重写的子类方法中居多,明确访问父类被重写成员。
2.Parent 可以访问父类静态属性、静态方法、类常量和普通方法
3.parent 使用范围解析操作符访问,前面有讲过解析操作符。Parent 可以访问类,但访问的是父类。
二、步骤
1.子类继承父类
2.子类重写父类方法
3.子类重写的方法还需要用到父类的方法,发现方法不够就要把父类方法拿过来,明确需要访问的父类成员
4.使用 parent 访问父类方法。
三、示例
来看例子,目前有一个需求,父类为数据库初始化类,数据库初始化类就是数据库已经做好了,子类为针对表的业务类,每张表就对应一个类,一个类就负责这张表的增删改查。子类继承父类,但是子类可能也有资源要初始化,需要重写父类的构造方法,但是一旦重写父类,父类的构造方法就不会改变,那父类数据库的初始化就做不了了。
比如说现在有一个DB 类,这是数据库初始化类,link属性直接初始化,然后加上一个 echo 证明他的存在。然后一个子类叫 table 类去继承父类,它也有自己的构造方法,但是他必须要让前一个构造方法执行,要让两个构造方法连接,此时要用到 parent 关键字。
代码如下
<?php
#Parent 关键字
class DB{
protected Slink;
public function construct(){
Sthis->1ink = mysq1i_connect(localhost""root'root''db_2'3306') or die('数据
库连接失败!');
echo_METHOD_
class Table extends DB{
# 重写父类方法
public function_construct(){
#让父类构造方法先执行
parent::__construct();
# 执行其他
Echo METHOD:
父类有了,子类也有了,重写了父类的构造方法,这也就意味着,把它实实例。可以看到table 的可以调用,而父类的永远无法调用,因为这个方法被子类已经重写过了,所有子类调用时都调用的子类的构造方法。此时如果要操作数据库,因为没有初始化,所有操作不了,这时使用parent 关键字,先执行父类的构造方法,再执行子类的构造方法,不会凌驾于父类的操作之上。一般父类的构造方法能提供资源才会用 parent ,如果不能则不需要用,这就是parent 的作用。
静态属性重写后,需要再自爱中进行访问需要用到 parent 来实现,因为重写的时候并没有覆盖之前的属性,在这加上 public statia ¥level=1,再加上 public statia ¥level=2,如果要用, 再增加一个方法,#访问父类的静态成员,前提是被重写,echo self 类名假 level2,发现确实访问的是自己的self,那如果访问的是父类,拿在这里加上一个parent,那么此时得到的是1,访问的是父类的,所有凡是被重写的成员,都可以使用 parent 进行访问。
做个小结,如果不想要访问父类的构造就不需要重写,如果要在普通的方法里面访问父类也可以,但是不符合业务,parent 的加之就是解决重写冲突的问题,一般只会在重写的方法里面使用 parent,parent 也可以访问静态的属性,可以重写,但不会被覆盖,但是不能用于访问父类的属性,因为父类的属性被重写后会被覆盖,就不存在了,普通的就直接使用就行,不需要使用 parent 关键字,使用的是范围使用操作解析,它更偏向于方法和类的调用,而不是对象的属性。