DAY22 - 接口与反射
第12章 接口
12.1 看一个实际的需求
12.2 接口的基本介绍
- 所谓接口:就是将一些抽象方法封装到一起,在某个类需要使用时,只需要实现该接口就可以, 说的实现接口就是指将该接口中的所有的抽象方法都实现了。
- 基本语法
interface 接口名称{
常量;
方法;
}
几点说明
(1) interface 是关键字,不能够修改,规定好 。
(2) 接口名称有命名规范是: iXxxxXxxx , 首先以小写的i开头. 后面使用大驼峰命名规则
(3) 接口中的方法,都是抽象方法, 但是不需要使用abstract 去修饰
(4) 接口中,不能有普通的成员属性,但是可以有常量.
12.3 使用接口的好处
12.4 快速入门案例
12.5 接口的最佳实践案例
- 使用接口的方式来模拟一下下面的运用场景
- 走代码
12.6 接口的应用场景
总结: 当我们需要定义一些规范(方法)时,可以将这些方法封装到接口中 ,然后让其他的类来实现该接口即可.
12.7 接口的细节讨论
(1) 接口不能被实例化
(2) 接口中所有的方法都不能有主体, 即接口中的方法都是抽象方法.
(3) 一个类可以实现多个接口,逗号隔开
举例说明:
(4) 接口中可以有属性,但只能是常量 ,默认是public, 但不能用public 显式修饰
(5) 一个接口不能继承其它的类,但是可以继承别的接口
12.8 类定义的进一步完善
12.9 继承类vs 实现接口
- 总结一下
(1) 实现接口可以看做是对php单继承机制的补充
(2) 实现接口可以在不打破继承的层级关系的前提下,对类的功能进行扩展
第13章 final关键字
13.1 基本介绍
当程序员不希望某个成员方法被子类重写时,我们可以将该方法修饰为final 方法.
当程序员不希望某个类被继承,我们可以将该类修饰为final 类.
final "最终"
13.2 基本语法
final 类名{
final 访问修饰符 function 方法名(){
//函数体
}
}
13.3 快速入门案例
总结
(1) //如果我们不希望子类去重写attack方法, 使用final 修饰即可
(2) //如果我们不希望子类来继承某个类, 则使用final修饰该类即可
13.4 final 的使用细节讨论
(1) final不能够修饰成员属性
(2) final 方法不能被重写,但可以被继承
(3) 一般来说,final 类中不会出现final 方法,因为final类都不能被继承,也就不会去重写override final类的方法了
(4) final 类 是可以被实例化的
第14章 类常量(const关键字)
14.1 为什么需要使用当类常量
在某些情况下,程序员可能有这样的需求:
当不希望一个成员变量被修改,希望该变量的值是固定不变的。这时可以用const 去修饰该成员属性,这样这个属性就自动成为常量 , 比如所得税率, 数学中的圆周率等
14.2 类常量的基本语法
类常量是在类中定义的.
class 类名{
const 常量名 = 初始值;
}
说明
(1) const 是关键字,规定好的而不能修改.
(2) 常量名的规范是 XXX_YYY , 全部大写,然后使用下划线间隔
(3) 类常量都是public , 但是我们不要使用public 去修饰.
14.3 快速入门案例
//计算公司所得税的案例.
14.4 关于类常量的使用细节说明
(1) 常量名一般字母全部大写 : TAX_RATE ,中间可以有下划线 TAX_RATE
(2) 在定义常量的同时,必须赋初值, 比如 const TAX_RATE=1.1
(3) const关键字前不能用public/protected/private修饰。默认是public
(4) 如何访问常量
在类的内部访问: 类名::常量名 self::常量名 接口::常量名
在类的外部访问: 类名::常量名 接口名::常量名
(5)常量的值在定义的时候就初始化,以后就不能修改
(6) 常量可以被子类继承
(7) 一个常量是属于一个类的,而不是某个对象的
(8) 关于常量可以是什么数据类的讨论
结论: 常量可以是 基本数据类型(int, float , bool, string), 还是可以是 array ,但是不能是对象。
(9) 类常量可以在类中,类的外部和其它普通函数中使用
第15章 PHP面向对象编程的相关技术
基本: 把php面向对象编程的各个知识点都过一下.
15.1 对象克隆技术和分析
15.2 对象遍历[了解,应付笔试]
- 看看如何对对象进行遍历: 所谓对象的变量,指的是对某个对象的属性进行遍历.
- 举例
在类的外部对对象进行遍历, 这时我们只能遍历到对象的public 属性.
15.3 php的内置标准类
看一个具体的需要: 如果,我们希望把一些数据,以对象的属性的方式存储,同时我们又不想定义一个类,可以考虑使用 PHP内置标准类 stdClass [standard标准]
php的内置标准类 stdClass , 这个是系统默认提供,不需要程序员去创建,而是直接使用就可以.
案例说明:
15.4 数据类型转对象和对象转数组的说明
在我们的开发中,有时会看到有人将数组或者基本数据类转成对象,那么这个是怎么回事?
- 举例说明
15.5 对象序列化和反序列化
- 基本介绍
所谓对象序列化是指: 将一个对象转换成一个字符串,这个字符串包括 属性名,属性值,属性类型, 和该对象对应的类名。简单的说明就把一个对象的数据和数据类型转成字符串.
- 看一个实际的需求
我要求同学们讲一个对象保存到文件中.(freeze 冷冻)-对象序列化.
- 反序列化
所谓反序列化就是指,将一个序列化的字符串,重新恢复成对应的对象.
说明
(1) 如果我们希望正确的操作反序列化对象,则需要引入该对象的类定义
- 对象序列化和反序列化的细节讨论
(1) 序列化的作用在哪些地方
- 对象序列化利于对象的保存和传输
- 可以让多个文件共享对象,而且我们将序列化后的对象保存到文件中,还可以达到在不同的时间段操作该对象.
(2) serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
代码说明:
(3) 与之相反, unserialize() 会检查是否存在一个 __wakeup()方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
代码说明:
15.6 类与对象的相关函数
在面向对象编程中,有一系列的函数,可以来对类和对象以及成员方法进行操作。我们重点讲解5个,其它的函数就请同学们自己去看一下即可.
代码举例说明:
15.7 traits 的讲解(重点)
- 看一个实际的需求
- 代码实现
- traits技术的细节说明
第16章 反射技术
16.1 当我们echo $对象时,输出该对象的属性,成员方法等等信息
- 举例说明:
16.2 反射机制的基本介绍
PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。
16.3 反射机制的使用场景
- 写底层框架(比如tp框架有一个控制器调度原理)
- 扩展类的功能
- 管理大量的未知类
16.4 看一个需求-一会我们一起搞定他
16.5 我们看一个简单的案例-反向代理调用
- 使用反射机制代理带有某个对象的方法
- 代码说明
16.6 反射机制的综合小练习-tp的控制器调度原理
走代码:
16.7 反射练习
16.8 小结: