重载
重载:overload,被重新加载。在面向对象里,重载指的当一个函数(方法),具有不同的返回值或者参数列表的时候,可以有不同的存在形式(允许同名函数存在:返回值或者参数列表不一样)
class Person{
public string function eat(){//吃饭方法;return ‘吃饱了’;}
public string function eat(水果){//吃水果;return ‘好吃’;}
public string function eat(主食){//吃主食;return ‘好吃’;}
}
PHP中不支持传统意义上的重载,因为php不允许同名函数(方法)存在。
PHP重载
当在PHP去访问一个没有权限或者不存在的属性或者方法的时候,会自动触发相关的魔术方法,这种机制就称之为PHP的重载。
属性重载
可以无限制的为一个对象增加属性。
无限制的增加会破会对象的结构。
魔术方法有很多:
__get():获取的意思,当对象去访问一个不存在或者权限不够的属性的时候,会自动触发的方法,帮助对象访问不能访问的属性
__set():与get一致,是不存在或者权限不够的时候,会自动触发的设置方法。
__isset():isset和empty时调用,当在外部使用isset或者empty去判断一个权限不够或者不存在的属性的时候,会自动调用
__unset():unset调用,当外部对对象的属性进行unset处理的时候会自动调用的方法
注意:所有的魔术方法都是为了增加类的容错处理以及对结构的控制(对象)
方法重载
当去访问一个权限不够或者不存在的方法的时候,会自动触发的魔术方法。
__call():普通方法,对象调用
__callStatic():静态方法,类调用
PHP重载意义
1. 为了增加类的容错处理,不会让代码因为访问一些不存在的或者权限不够的属性或者方法的时候,直接报错
2. 为了保护对象的结构:不允许无限增加,不允许随意unset(删除)
需求:允许第一次操作从类实例化对象,但是其后的每次操作都要求将对象保存到文件,然后直接取出来使用。
对象的保存和还原
将对象保存到对应的文件里,然后再取出来使用(取出之后依然是对象)。
文件内部只能存储字符串,而对象是复合数据,不能存放到文件。
对象的保存
想办法将一个对象转换成字符串,转换成一个有结构的字符串。(结构:按照数据类型进行处理的结构)
序列化:将一个复合数据类型,按照里面本身数据(元素或者属性)的数据类型,进行整理,整理成一个可以被还原的带结构的字符串;
serialize:参数是一个复合数据类型,返回值是一个字符串
对象的还原
还原就是将一个有结构的字符串转换成一个对应的数据类型(复合)。
反序列化:将序列化后的字符串还原成原来的结构。
unserialize:参数是一个序列化好的字符串,而返回值是一个对应的数据类型
要保证反序列化能得到对应的类,必须保证对应的类在内存中存在,否则系统会默认的变成系统类的对象。
自动加载
资源类型是不可以被序列化:当对一个数据进行序列化的时候,如果里面有资源类型,会自动的会被转成int类型,并且失去该资源。
魔术方法:专门用于数据对象保存和还原
__sleep():睡眠,当一个对象想要变得不再活跃的时候(写入到文件:序列化),会自动调用的方法,这个方法用于指定保存到文件中所有属性(资源属性没有必要保存)
效果
反序列化效果
希望在反序列化的时候,系统能够自动的与服务器建立连接。
__wakeup():唤醒,当一个休眠状态的对象被重新唤醒(反序列化)会自动调用的魔术方法
效果
自动加载机制
对象遍历
对象中只保存了属性,所谓的对象遍历就是遍历对象中的属性(只能是public属性)。
遍历对象与遍历数组一致,使用foreach
需求:需要遍历对象中某一个指定的属性(属性是一个数组),如果想通过foreach直接遍历对象的话是不可能实现的。
如果要实现,需要修改对象对应类的实现机制,必须去实现一个叫做Iterator的接口。实现对应的方法,来修改foreach在遍历对象时候的机制。
实现接口Iterator
如果数组元素本身出现false或者可以转换成false的元素值,那么就会实现
需要通过判断数组的下标来进行数组指针的有效性判断。