类的继承
- a类拥有b类的所有特性,并且还可以拥有一些自己的特性;就可以实现a类继承b类,并在这个基础上追加一些特性;
- 继承:一个类从另一个已存在的类中获取其特性就是继承 (从父类的角度看)
- 派生:从一个已有的类中产生一个新的类,称为派生;(从子类的角度看)
- 子类和父类的定义: 本身被继承的类称之为父类(又叫基类),继承别的类来获取特性的类称之为子类(派生类)
- 单继承:一个子类只能继承一个父类的特性 大多数语言都是单继承;c++是多继承
- 扩展:扩展就是一个子类继承完特性后,再定义本身的属性,没有拓展继承就没有意义
访问权限的修饰符
Public 公共的;在本类,继承关系的类,和类外都能用
Protected 受保护的:在本类和继承关系的类都能使用
Private 私有的:只能在本类中使用;
关键字
Self 指类本身;
$this 也是指类本身;
Parent 指父辈;
Static 定义静态属性,方法时使用;
abstract 创建抽象类和抽象方法时使用
构造和析构方法在继承中的表现
构造方法:
- 在子类中没有定义构造方法时,会调用父类的构造方法,调用父类的构造方法时要按照父类的调用方式来;
2. 子类定义了构造方法时,优先调用子类的,也可以手动调用父类的构造方法;(parent::__construct();)
3.通常情况下,都会调用父类的构造方法来节约代码
4. 上三条构造方法同样适用于析构方法
重写 override
一.
重写又叫覆盖,子类继承父类的方法和属性重新“定义”就是重写;
重写时,子类的所有属性和方法必须和父元素的相等,在通过子元素调用和父元素相等的属性或方法时,会以子元素的为准
二.
访问控制权限:
下级的访问控制权限应该不低于上级的访问控制权限:
上级:public 下级:只能public
上级:protected 下级: protected, public
上级:private 下级:private protected public——实际此情况无意义。
私有的不能覆盖,而是完全当作自己全新的。
三.
- 构造方法的重写,可以像普通方法一样重写,而且参数还可以不一致
- 父类私有权限的属性和方法是不能被覆盖的,但是子类通过编辑相同的方法和属性来重写;但方法的参数必须一致;
最终
最终类:
最终类就是代表不能被继承的类
形式:
final class 类名{ 。。。。类定义。。。。}
最终方法
最终方法是不能被覆盖和重写的
形式:
final function 方法名(){。。。。方法定义。。。。}
设计模式
主要指一些事情的处理经验,不同的解决方法也可以称之为不同的设计模式
1.工厂模式
通过一个类,来实现传不同的参数,实现不同的实例化对象就可以称这个类为工厂;而这个工厂的作业就是产出不同的对象
2.单例模式
根据不同的要求,某个类只能被实例化对象一次,就是单例模式;
单例模式有一个三私一功;两个私有方法,一个私有属性,一个公用方法
抽象类
1.抽象类就是在类定义时,class前面加abstract这个关键字,这个类就是一个抽象类;
2.抽象类的主要作用就是用来当做父类的
3.抽象类的定义abstract class 类名{.....类的定义.....}
4.抽象类的里面主要就是一些子类的共有属性和共有方法,用抽象类来继承
抽象方法
1.抽象方法是配合抽象类来规范子类的写法;定义时也是需要加abstract这个关键字
2.抽象方法的定义abstract function f1($x1, $y, $m); //注意,后面一定有分号。
3.抽象方法就是要求下级,也就是子类要怎么做的
抽象类和抽象方法的细节描述
1.如果一个方法是抽象方法,那么这个类也必须是抽象类
2.一个抽象类中有或没有抽象方法并没有多大关系,但通常对于这个抽象类来说意义不大
3.一个子类继承抽象类后,必须全部重写抽象类的抽象方法,除非这个子类也是个抽象类
4.子类实现抽象父类的方法时,访问控制修饰符的范围不能降低,且方法的参数也须一致——其实这就是重写,所以要满足重写的要求。
PHP中的重载技术
其实就是同一个方法名中有个数不同的参数,参数不同可以是个数不同,参数不同,顺序不同,但是php中不能重复定义同一个方法,会报错;
所以PHP中的重载是另外一种定义:
属性重载: 如果使用一个不存在的属性,就会去自动调用类中预先定义好的某个方法以处理数据;
方法重载: 如果使用一个不存在的方法,就会去自动调用类中预先定义好的某个方法以处理该行为
属性重载:
如果某属性不存在,但在语法中使用如下情形,则会发生:
取值:$v1 = 对象->属性; ===>自动调用类中的__get()方法
赋值:对象->属性 = XX值; ===>自动调用类中的__set()方法
判断是否存在:isset(对象->属性;) ===>自动调用类中的__isset()方法
销毁:unset(对象->属性;) ===>自动调用类中的__unset()方法
前提都是:类中要预先定义好这些方法。
方法重载:
当使用一个对象调用一个不存在的普通方法的时候,会自动去调用预先定义好的"__call"方法。
上面所学的几个方法都被称为“魔术方法”:
__get(), __set(), __isset(), __unset(), __call(), __callstatic();
接口:
类:有属性,有方法;有类常量;
抽象类:有属性,有方法;有类常量; 还可以有抽象方法(只有方法头)
“更”抽象类(就是接口) :有接口常量;还可以有抽象方法(只有方法头)
接口简单来说就是抽象类的集合体,来规范抽象类的写法;
接口可以实现“多继承”(多实现),而类不行。
一个类只能继承一个父类,但可以实现多个“上级接口”,语法形式:
class 类A extends 类B implements 接口1,接口2,.... { 。。。类定义语句。。。}
一个接口同样可以继承另一个接口(也是单继承):
interface 接口1 extends 接口2 {接口定义}