面向对象编程 —— OOP(Object-Oriented Programming)
面向对象的三大特征
封装、继承、多态
对象
万事万物皆对象
客观存在的任何一个实体
类
对相同或相似对象的一种抽象描述
类与对象
通常先有类,通过类实例化出对象;大多数情况下使用的是对象
类的定义格式
class 类名
{
[成员属性] —— 相当于变量
可以有默认值
不能是变量
可以是常量
可以有运算 5.6+
值可以是任意类型
[成员方法] —— 相当于函数
和以往的函数一致
可以直接访问自己的成员属性($this)
}
类的实例化
new
$对象名 = new 类名;
$对象名 = new 类名();
每次new都会得到一个新对象
都会触发构造方法
对象成员访问符 ->
$对象名->属性名; //加了$,含义不一样
$对象名->方法名();
伪变量 $this
类型是一个对象,表示的是自己
不能在类外使用
魔术方法
构造方法
__construct()
在使用new关键字得到新对象的时候
析构方法
__destruct()
在销毁对象的时候。脚本执行完毕,会自动销毁对象
对象的比较
=
取别名,不会产生新对象
==
判断是否是同一个类的实例,并且属性和值是否相同
===
判断两个对象是否是同一个对象
PDO的基本使用
封装
三个关键字
public、protected、private
三个范围
自己、家族、外部
3P表
自己 家族 外部
public Y Y Y
protected Y Y N
private Y N N
魔术方法
__construct构造方法(可能会看到和类名同名的方法)
触发时机:使用new关键字得到新对象的时候
参数:可有可无
__destruct析构方法
触发时机:销毁对象的时候
参数:不能有
__set
触发时机:在给一个没有权限访问或者不存在的属性赋值的时候
参数:2个(要赋值的属性名,值)
__get
触发时机:在获取一个没有权限访问或者不存在的属性的时候
参数:1个(要获取的属性名)
__isset
触发时机:在使用isset函数检测一个没有权限访问或不存在的属性的时候
参数:1个(要检测的属性名)
__unset
触发时机:在使用unset函数删除一个没有权限访问或不存在的属性的时候
参数:1个(要删除的属性名)
__call
调用没有权限访问或者不存在方法的时候
__callStatic
调用没有权限访问或者不存在静态方法的时候
__toString
将对象当做字符串输出的时候
__invoke
将对象当做函数调用的时候
__sleep
使用serialize串行化对象的时候
__wakeup
使用unserialize反串行化的时候
__clone
使用clone关键字克隆对象的时候
__autoload
在使用不存在的类的时候
唯一一个写在类外的方法
extends
用于继承
父类
被其他类继承的类,也叫基类
子类
继承其他类的类,也叫派生类
继承本身的特性
PHP只支持单继承 只能有一个爹
PHP可以被多个继承 一个爹可以有多个儿子
PHP支持多层继承 可以有祖孙关系
属性的继承
子类会覆盖父类的同名属性,私有除外
权限只能扩大,不能缩小
父类 子类
public public
protected public protected
private public protected private
访问的一定是覆盖后的结果,私有的无法覆盖
方法的继承
子类会覆盖父类的同名方法,私有除外
权限只能扩大,不能缩小
父类 子类
public public
protected public protected
private public protected private
访问的一定是覆盖后的结果,私有的无法覆盖
建议:重写父类的方法的时候,参数结构(个数,是否有默认值)保持一致;
可以通过parent关键字调用父类的方法
要求:重写构造方法的时候,务必先调用一次父类的构造方法,保证基类正常运行
parent::__construct();
父类名::__construct();
关键字
final
可以修饰类和方法
被修饰的类不能被继承,方法不能被重写
static
可以修饰方法和属性,不能修饰类
静态方法里面不能出现$this
静态方法里面只能访问静态的成员属性
self::$属性名
类名::$属性名
const
在类里面定义常量
self::常量名
类名::常量名
instanceof(运算符)
用于判断前面的对象是否是后面类的实例,包括祖孙关系
抽象类:制定规范
包含抽象方法的类就是抽象类
必须用abstract来修饰
抽象类是一个半成品,不能直接实例化
必须继承并且子类要实现所有的抽象方法
可以有自己的普通方法
抽象方法
没有方法体的方法
必须用abstract来修饰
必须以分号结尾
不能是private和static
接口:制定规范
定义格式
interface 接口名{
[常量]
[抽象方法]
}
特性
接口里面所有都是抽象方法,不需要用abstract修饰
接口与类之间是实现(implements)关系,可以多实现(用逗号隔开)
接口与接口之间是继承关系
类在继承其他类的同时还可以实现接口(多实现)
和抽象类的区别
如果只是单纯的定义规范,两种都可以
如果定义规范的同时还要共享一些方法,就必须是抽象类
多态:不同的对象做相同的事情得到不同的结果
和类相关的函数
1. class_alias('旧类名', '新类名');
给类名取个别名
2. method_exists(对象或者类名, '方法名');
检测对象或者类(不受封装限制)中的方法是否存在
3. property_exists(对象或者类名, '属性名')
检测对象或者类中的属性是否存在,父类的私有属性无法检测
4. class_exists('类名')
检测类是否存在
5.get_object_vars(对象)
获取对象中有权限访问的成员属性,返回一个数组
6.get_class_methods(类名或者对象)
获取类或者对象中有权限访问的方法,返回一个数组
7.get_parent_class('子类名');
获取父类类名
try-catch和异常类
$e = new Exception('胖子固有一死,或重于泰山,或重于其他山');
try {
echo 123;
throw $e;
echo 321; //无法执行到
} catch (Exception $e) {
echo $e->getMessage();
}