1 多态
多态:多种形态。
多态分为两种:方法重写和方法重载
1.1 方法重写
子类重写了父类的同名的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php
class Person { public function show() { echo '这是父类<br>'; } }
class Student extends Person { public function show() { echo '这是子类<br>'; } }
$stu=new Student; $stu->show();
|
注意事项:
- 子类的方法必须和父类的方法同名
- 参数个数要一致
- 子类修饰的不能比父类更加严格
1.2 方法重载
在同一个类中,有多个同名的函数,通过参数的不同来区分不同的方法,称为方法重载
💡 注意:PHP不支持方法重载,但是PHP可以通过其他方法来模拟方法重载。
2面向对象三大特性
- 封装
- 继承
- 多态
3 私有属性继承和重写
私有属性可以继承但不能重写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php class A { private $name='PHP'; public function showA() { echo $this->name,'<br>'; } } class B extends A { private $name='Java'; public function showB() { echo $this->name,'<br>'; } } $obj=new B(); $obj->showA(); $obj->showB();
|
4 方法修饰符
方法修饰符有:static、final、abstract
4.1 static【静态的】
- static修饰的属性叫静态属性、static修饰的方法叫静态方法
- 静态成员加载类的时候分配空间,程序执行完毕后销毁
- 静态成员在内存中就一份。
- 调用语法 类名::属性 类名::方法名()
1 2 3 4 5 6 7 8 9
| <?php class Person { public static $add='北京'; static public function show() { echo '这是一个静态的方法<br>'; } } echo Person::$add,'<br>'; Person::show();
|
💡 注意:self表示所在类的类名,使用self降低耦合性
静态成员也可以被继承
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php class Person { public static $add='中国'; public static function show() { echo '这是人类<br>'; } }
class Student extends Person { }
echo Student::$add,'<br>'; Student::show();
|
静态延时绑定
static表示当前对象所属的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php class Person { public static $type='人类'; public function show1() { echo static::$type,'<br>'; } } class Student extends Person { public static $type='学生'; public function show2() { echo static::$type,'<br>'; } }
$obj=new Student(); $obj->show1(); $obj->show2();
|
小结:
1、static在内存中就一份,在类加载的时候分配空间
2、如果有多个修饰符,修饰符之间是没有顺序的
3、self表示所在类的类名
4、static表示当前对象所属的类
5、static有两个作用,第一表示静态的,第二表示类名
4.2 final【最终的】
final修饰的方法不能被重写
final修饰的类不能被继承
4.2.1 作用
1、如果一个类确定不被继承,一个方法确定不会被重写,用final修饰可以提高执行效率。
2、如果一个方法不允许被其他类重写,可以用final修饰。
4.3 abstract【抽象的】
- abstract修饰的方法是抽象方法,修饰的类是抽象类
- 只有方法的声明没有方法的实现称为抽象方法
- 一个类中只要有一个方法是抽象方法,这个类必须是抽象类。
- 抽象类的特点是不能被实例化
- 子类继承了抽象类,就必须重新实现父类的所有的抽象方法,否则不允许实例化
- 类中没有抽象方法也可以声明成抽象类,用来阻止类的实例化
4.3.1 抽象类的作用
1、定义命名规范
2、阻止实例化,如果一个类中所有的方法都是静态方法,这时候没有必要去实例化,可以通过abstract来阻止来的实例化。
5 类常量
类常量是const常量
1 2 3 4 5 6
| <?php class Student { const ADD='地址不详'; } echo Student::ADD;
|
问题:define常量和const常量的区别?
答:const常量可以做类成员,define常量不可以做类成员。
问题:常量和静态的属性的区别?
答:相同点:都在加载类的时候分配空间
不同点:常量的值不可以更改,静态属性的值可以更改
6 接口(interface)
6.1 接口
- 如果一个类中所有的方法是都是抽象方法,那么这个抽象类可以声明成接口
- 接口是一个特殊的抽象类,接口中只能有抽象方法和常量
- 接口中的抽象方法只能是public,可以省略,默认也是public的
- 通过implements关键字来实现接口
- 不能使用abstract和final来修饰接口中的抽象方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php
interface IPerson { const ADD='中国'; function fun1(); function fun2(); }
class Student implements IPerson { public function fun1() {
} public function fun2() {
} }
echo IPerson::ADD;
|
6.2 接口的多重实现
类不允许多重继承,但是接口允许多重实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php interface IPic1 { function fun1(); } interface IPic2 { function fun2(); }
class Student implements IPic1,IPic2 { public function fun1() {
} public function fun2() {
} }
|
注意:
1、在接口的多重实现中,如果有同名的方法,只要实现一次即可
2、类可以继承的同时实现接口
1 2 3
| class Student extends Person implements IPIc1,IPic1{
}
|
7 匿名类
这是了解的内容,PHP7.0支持
1 2 3 4 5 6 7 8 9 10 11 12
| <?php $stu=new class { public $name='tom'; public function __construct() { echo '构造函数<br>'; } }; echo $stu->name;
|
小结:
1、如果类只被实例化一次就可以使用匿名类
2、好处,在执行的过程中,类不占用空间
8 方法绑定
这是了解的内容,PHP7.0支持
1 2 3 4 5 6 7 8 9 10 11 12
| <?php $stu=new class { public $name='tom'; public function __construct() { echo '构造函数<br>'; } }; echo $stu->name;
|
小结:
1、如果类只被实例化一次就可以使用匿名类
2、好处,在执行的过程中,类不占用空间
9 异常处理
集中处理在代码块中发生的异常。
在代码块中发生了异常直接抛出,代码块中不处理异常,将异常集中起来一起处理。
9.1 使用的关键字
1 2 3 4 5
| try:监测代码块 catch:捕获异常 throw:抛出异常 finally:无论有无异常都会执行,可以省略 Exception:异常类
|
语法结构
1 2 3 4 5 6 7 8
| try{ }catch(Exception $ex){ } finally{ }
|
9.2 自定义异常
场景:如果实现异常的分类处理?比如异常有三个级别异常对应三种处理方式
自定义三种异常即可
所有异常类的父类是Exception,Exception中的方法不允许重写