7.1 为什么需要抽象类
l 先看一个问题?
image.png
image.png
7.2 抽象类的基本介绍
当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract 来修饰该类 [抽象类]。
image.png
7.3 抽象类的细节说明
l 抽象类不能被实例化
代码说明:
image.png
l 抽象类可以没有abstract方法
l 抽象类可以有非抽象方法, 成员属性和常量
代码说明:
image.png
l 一旦类包含了abstract方法,则这个类必须声明为abstract
l 抽象方法不能有函数体
image.png
l 如果一个类继承了某个抽象类,则它必须实现该抽象类的所有抽象方法.(除非它自己也声明为抽象类), 如果是多级继承,则需要把所有的抽象方法都实现.
代码说明:
image.png
image.png
7.4 抽象类的最佳实践
image.png
代码:
image.png
image.png
image.png
l 课堂练习
image.png
8.接口
2.1 接口的概念
image.png
2.2 接口的介绍
image.png
l 怎么理解接口和价值.
image.png
2.3 接口的基本使用
image.png
l 快速入门案例:
image.png
l 我们使用代码来模拟一下我们的设备接入到电脑插口中的情
image.png
image.png
image.png
8.4 接口的应用场景
image.png
image.png
8.5 接口的细节
l 接口不能被实例化
代码:
l 接口中所有的方法都不能有主体
l 类可以同时实现多个接口
类和接口的关系时实现,接口和接口的关系时继承!
l 接口中可以有属性,但只能是常量 ,默认是public, 但不能用public 显式修饰
案例说明:
image.png
l 接口中的方法都必须是****public****的****,****默认就是****public
l 一个接口不能继承其它的类****,****但是可以继承别的接口
示意图:
image.png
代码:
image.png
8.6 类的定义改进
image.png
8.7 接口和继承的区别
image.png
代码:
image.png
image.png
8.8 小结
image.png
9.final 关键字
9.1 基本概念
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承.
1.2 什么情况下可能使用到final
image.png
l 基本语法是:
final class 类名{
} //final 类
class 类名{
final 访问修饰符 function 方法名(){} // final 方法
}
9.3 快速体验案例
image.png
image.png
image.png
9.4 final 练习题
image.png
9.5 final 使用注意事项
l final不能够修饰成员属性(变量)
l final 方法不能被重写,但可以被继承.
l 一般来说,final 类中不会出现final 方法,因为final类都不能被继承,也就不会去重写override final类的方法了。
l final 类 是可以被实例化的
案例说明:
image.png
第 10 章 类常量(const)
10.1 基本概念
某些情况下,程序员可能有这样的需求:
当不希望一个成员变量被修改,希望该变量的值是固定不变的。这时可以用const 去修饰该成员变量,这样这个变量就自动成为常量 , 比如所得税率, 数学中的圆周率等
10.2 基本语法
class 类名{
const 常量名 = 初值;
}
常量的定义如上,不需要访问修饰符,也没有$, 名字是大写字母.
10.3 快速入门案例
image.png
10.4 使用的注意事项
l 常量名一般字母全部大写 : TAX_RATE ,中间可以有下划线 TAX_RATE
l 在定义常量的同时,必须赋初值, 比如 const TAX_RATE=1.1
l const关键字前不能用public/protected/private修饰。默认是public
l 注意事项,访问的情况
image.png
image.png
image.png
说明上面的代码
(1) 在类的内部,我们访问类常量可以使用 self::常量名 或者 类名::常量名,但是我们推荐使用 self::常量名;
(2) 在类的外部,可以使用 类名::常量名,注意常量也可以在其它函数中使用。
l 常量的值在定义的时候就初始化,以后就不能修改.
l 常量可以被子类继承
l 一个常量是属于一个类的,而不是某个对象的
l 常量可以接收哪些数据类型
代码:
image.png
总结: 常量可以是 int , float, bool, string ,array, 对象不可以。
10.5 常量练习题
image.png
11 PHP面向对象的相关技术
11.1 对象克隆技术和分析
image.png
代码:
image.png
11.2 对象的遍历
l 基本的说明
image.png
代码说明:
image.png
11.3 php内置标准类
基本概念:如果,我们希望把一些数据,以对象的属性的方式存储,同时我们又
不想定义一个类,可以考虑使用 PHP内置标准类 stdClass [standard标准]
基本使用:
PHP的语法松散:
11.4 其它数据类型转对象的说明
image.png
代码:
image.png
11.5 对象的序列化和反序列化(重点)
对象的序列化的基本概念: 所谓对象的序列化,就是可以把某个对象的属性名称,属性值, 属性类型,类名 以字符串的形式保存到文件中,在你需要的时候可以重新恢复.
对象的反序列化的基本概念, 是序列化的逆向过程.
代码:
序列化的代码:
image.png
反序列化的代码:
image.png
l 对象序列化的练习
image.png
11.6 将对象当做字符串使用
要求: 将对象的类名,函数,属性都显示出来。
image.png
代码:
image.png
image.png
11.7 类与对象的相关函数(重点)
概述: 函数的一览表:
image.png
l 重点讲解五个函数,其它的同学们可以自己看.
image.png
image.png
11.8 traits使用(掌握)
基本概念的介绍: PHP的OOP编程中,为了让单继承更好的复用代码,提供了一套机制,可以灵活的引入代码,这个机制就是我们的traits.
看图说明:
l 代码实现:
image.png
image.png
l 特别说明一下, traits 的优先级问题.
说明: 如果父类和trait 代码都有相同的函数,则以trait的代码为准.
11.9 这里单例模式加强说明
为了让单例防止程序员继承,我们将其做成一个 final 类.
image.png
11.10 反射机制
l 基本介绍
image.png
l 反射技术在哪里使用到
image.png
l 一个经典的tp控制器调度需求
image.png
l 打点基础
比如我们常规的调用成员方法的形式是这样的
$对象 = new 类();
$对象->方法();
方法对象->invoke($对象, '参数');
l 案例:我将使用反射的机制,实现代理调用. 方法对象->invoke($对象, '参数');
image.png
l 代码:
image.png
l 我们完成前面提出的tp 调用机制
image.png
代码:
<?php
header('content-type:text/html;charset=utf-8');
class IndexAction{
public function index(){
echo 'index <br>';
}
public function test($year = 2016, $month = 10, $day = 10){
echo $year.'--------'.$month.'-----------'.$day.'<br>';
}
public function _before_index(){
echo '<br> 前期处理....';
echo '<br>' .__FUNCTION__.'<br>';
}
public function _after_index(){
echo '<br> 后期的处理';
echo __FUNCTION__.'<br>';
}
}
/*
1.IndexAction中的方法和访问控制修饰符是不确定的,如果index 方法是public,可以执行 _before_index.
2.如果存在_before_index 方法,并且是public的,执行该方法
3.执行test方法
4. 再判断有没有_after_index方法,并且是public的,执行该方法
*/
//1. 先创建一个反射对象
$reflect_object = new ReflectionClass('IndexAction');
//2. 判断index方法是否存在
if($reflect_object->hasMethod('index')){
echo '<br> 有index';
//3. 获取 index这个方法对象
$reflect_index_method = $reflect_object->getMethod('index');
if($reflect_index_method->isPublic()){
echo '<br> index 是public';
//获取 _before_index 方法
if($reflect_object->hasMethod('_before_index')){
//获取 _before_index 方法对象
$reflect_before_index_method = $reflect_object->getMethod('_before_index');
//判断是否是public
if($reflect_before_index_method->isPublic()){
$reflect_before_index_method->invoke
($reflect_object->newInstance());
}
}
//反向调用test
$reflect_object->getMethod('test')->invoke($reflect_object->newInstance(), 2017, 11,11);
//判断后置函数是否执行.
//获取 _after_index 方法
if($reflect_object->hasMethod('_after_index')){
//获取 _after_index 方法对象
$reflect_after_index_method = $reflect_object->getMethod('_after_index');
//判断是否是public
if($reflect_after_index_method->isPublic()){
$reflect_after_index_method->invoke
($reflect_object->newInstance());
}
}
}
}else{
echo '<br>没有index, 直接退出';
}
l 课后练习题:
image.png
l 小结
image.png
网友评论