OOP的介绍
定义
面向对象程序设计
面向对象的优点
分工明确
提高开发效率
提高项目的灵活性
提高项目的可扩展性
特点
封装
继承
多态
对象的操作
实例化一个对象
new 类名();
new 类型;
定义类
成员属性 修饰符
成员方法 修饰符
对象和类
对象 类的实例 例如:房子
类 对象的抽象 例如:房子的图纸
对象实例化 和 调用
new 类名() $this->
对象在内存中的存储
对象名(地址)保存在栈中 先进后出
对象内的代码保存在堆里 先进先出
封装性
定义 把成员属性和成员方法 设置为非公有,就称为封装性
特点
被封装的属性/方法 无法在外部调用
只能通过$this-> 内部调用
优点
重用性
可读性
属性的封装
实现 访问控制
提升开发效率的同时,提醒我们对象封装的底线
继承
定义 子类继承父类的成员属性与成员方法
类继承的应用
作用
通过继承可以简化类的定义
方便扩展,扩展功能可以写在子类中,不会对原有父类产生影响
方便升级,通过继承不但包含了旧的方法,还同时添加了新的功能
特点
单继承
一个父类可以被多个子类继承
一个子类只能继承一个父类
子类重写父类的方法
定义跟父类方法重名的就可以重写
子类中调用父类方法 parent::funName()
魔术方法
__construct()
可选参数,对象被实例化时自动触发
作用 给属性赋初值,用于打开资源
__destruct()
无法传参,属性销毁之前自动触发
作用 关闭构造方法中打开的资源
__get($param)
一个参数,在外部使用非公有属性是自动触发
作用 在外部访问非公有属性
注意 __get()必须是public
__set($params,$values)
两个参数,在对象外部设置非公有属性时自动触发
作用 在对象外部设置封装属性
注意 __set()必须是public
__isset($param)
一个参数,在对象外部检测封装属性是否存在时自动触发
注意 使用empty()判断非公有属性时,必须配合__get()一起使用
__unset($param)
一个参数,用unset()销毁一个非公有属性时自动触发
注意 销毁公有属性时,由于可以直接访问,所以不需要再设置该魔术方法
__clone()
在该对象被克隆的时自动触发
注意 如果封装该魔术方法,会导致该对象不能被克隆
__toString()
用echo或print输出对象时自动触发
作用 必须return一个string,一般用于对象的描述信息
__invoke()
把对象当做函数调用时自动触发
__call($funName,$params)
两个参数(方法名,值)当调用对象不存在的方法时自动触发
作用 当用户调用了不存在的操作时,用来做友好的提示
__callStatic($funName,$params)
两个参数(方法名,值)当调用对象不存在的方法时自动触发
作用 当用户调用了不存在的操作时,用来做友好的提示
__sleep()
当对象被串行化时,自动调用
__wakeup()
当已被串行化的对象被反串行化时,自动调用
__autoload()
当new实例化一个不存在的类时,则自动调用此函数“__autoload()”,并将类名作为参数传入此函数
作用 帮助判断是否存在需要加载的类
关键字
final
可以用于修饰类和方法,最终版本,不能被重写
作用 提高代码的安全性,可读性
注意 不能使用final来修饰成员属性
static
用于修饰属性和方法,静态属性,静态方法,不需要实例化
作用 类中的几个方法没有太大联系时,可以声明为静态方法
注意 静态属性是共享的。也就是new很多对象也是共用一个属性
由于静态修饰后,每次访问都是访问的同一个,所以不存在继承问题
在一个类的方法中若没有出现$this的调用,默认此方法为静态方法
静态方法中不可以使用非静态的内容。就是不让使用$this
const
在类的内部 定义 常量
内部 self::Name
外部 类名::Name
作用 给该类中的方法设置参数选项
instanceof
判断当前对象类是否属于某个类的类型 返回true/false
abstract
声明抽象方法和抽象类 有抽象方法的类就是抽象类
串行化
serialize() 串行化
unserialize() 反串行化
作用 把当前状态下的对象 连同对象格式与属性值的变换 转换为字符串格式
对象是保存在内存中,寿命通常随着生成该对象的程序终止而终止,而串行化后的对象就可以实现永久存储,可以用做数据缓存
json
json_encode() 转化为json格式
json_decode() 将被转化成json函数的数据还原
作用 数组的永久存储
便于不同语言之间的数据传输(接口)
stdClass
快速得到一个对象
注意 凡是用 new stdClass()的变量都不可以出现$a->test()这种方式的使用
类型约束
约束方法和函数的传输类型
作用 数组 array $param
类 类名 $param
namespqce
前不允许有任何的php代码
接口
定义 一个语法,和平时熟知的API接口没有一点关系,使用interface定义
interface 声明接口时使用
特点
接口中的方法,必须全是抽象方法(所有无需abstract声明)
接口的所有成员实现,必须是常量
所得权限必须是public
声明接口不使用class,使用interface
接口可以被类继承实现全部方法,也可以被抽象类继承实现部分方法
接口继承不能用extends,用implements
inplements实现接口
一个类在继承另一个类的同时,使用implements实现一个接口(一定要先继承在实现),可以实现多个接口,逗号隔开就好
异常处理
错误处理
错误级别
parse error 解析错误
fatal error 致命错误
waring 警告
notice 提示
strict 规范建议
自定义错误处理
set_error_handler('funName')
设置用户定义的错误处理函数,只能接收 waring 和 notice 错误
异常处理
一种可扩展,易维护的错误处理统一机制,提供了一种新的面向对象的错误错误处理方式
异常处理方式 完全交给系统自带的系统自带的异常处理类 Exception 是所有PHP异常的基类
命名空间
定义 命名空间就是逻辑层面的目录结构 相当于在代码中分了文件夹
作用 在不同的目录中可以有相同的文件名 在不同的命名空间中可以有相同的名字
基本规则
命名空间的定义语句前面不能有任何PHP代码
命名空间不能控制普通变量的访问,不同空间仍旧可以传递普通变量的值
如果使用{}定义命名空间 那么括号外不能有任何代码
限定名称
非限定名称 test(); 当前空间下
限定名称 A est(); 相对路径 ./A/test()
完全限定名称 A est(); 绝对路径 从全局命名空间出发
常量
__NAMESPACE__当期所在空间的空间名