对象序列化
- 只能序列化对象内部的数据,即非静态属性。
需在反序列化对象之前加载类,也可以触发自动加载机制。
__sleep 序列化需序列化的属性。
- 提交未提交的数据,或类似的清理操作,部分串行化对象。
- 返回一个包含对象中所有应被序列化的变量名称的数组
__wakeup 反序列化时,预先准备对象需要的资源
- 重新建立数据库连接,或执行其它初始化操作
public function __sleep() {
return array('server', 'username', 'password', 'db');
}
public function __wakeup() {
$this->connect();
}
对象继承
class 子类名 extends 父类 {}
如果一个对象是子类的对象,那么同时也是父类的对象。
单继承:一个类只能继承一个父类,不能同时继承多个类。但一个父类可以被多个子类继承。
instanceof 判断某对象是否为某类的对象
对象名 instanceof 类名
访问控制
public 公有的(继承链、本类、外部均可访问)
protected 保护的(仅继承链、本类可访问)
private 私有的(仅本类可访问)
根据成员定义位置、访问位置判断。
兼容性问题
- 声明属性时,var关键字声明的默认为public权限
- 声明方法时,省略访问修饰符,默认为public权限
重写 override
$this代表本对象,被谁调用,就代表哪个对象。
- 继承时,子类成员名于父类成员名发生冲突,则子类成员会重写父类成员。
- 属性和方法均可被子类重写。
- 当父类的方法或属性已经不满足子类的需求,则需要重写。
- 也可能因为命名不规范导致重写。
私有属性不能被重写,每个私有属性都会被记录。在记录属性名的同时,还会记录类。
如果有内置函数被重写,则可调用父类方法。如调用父类构造方法parent::__construct()
重写限制
访问限制:
子类的成员的访问控制必须相等或弱于父类。
方法参数限制:
参数数量必须相同,参数名可不同。
$this确定原则
$this为调用该方法的对象,表示该方法的执行环境对象。
- 对象调用
- 环境的传递。如果当前调用时,不能确定$this的值(静态调用),此时静态调用所处对象环境会传递到被调用的方法内。
$this并非永远代表本对象,而是由方法的执行环境决定。
final
如果父类中的方法被声明为final,则子类无法覆盖(重写)该方法。
如果一个类被声明为final,则不能被继承。
但加有final关键字的类依旧能被实例化!
抽象类
关键字:abstract
抽象类不能直接被实例化,必须先继承该抽象类,然后再实例化子类。
抽象类中至少要包含一个抽象方法。非抽象类不能包含抽象方法。
如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。抽象方法不能包含大括号及方法体。
继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法。
即,子类必须重写抽象父类中的所有抽象方法。
另外,这些方法的可见性必须和抽象类中一样(或者更为宽松)。
即,如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不能定义为private。
- 抽象类的子类中的普通方法执行方式和其他类相同。
- 作用:
1. 继承,为扩展类,统一公共操作。
2. 限制结构(规范)。规范子类的结构。
对象的遍历(迭代)
- 对象通过属性保存数据,故遍历对象的属性。
- foreach语言结构,获得属性名和属性值。
foreach ($obj as $p_name => $p_value) {}
自定义遍历(迭代器Iterator)
Iterator - 可在内部迭代自己的外部迭代器或类的接口
Iterator::current — 返回当前元素
Iterator::key — 返回当前元素的键
Iterator::next — 向前移动到下一个元素
Iterator::rewind — 返回到迭代器的第一个元素
Iterator::valid — 检查当前位置是否有效
对象的克隆
//对象之间的传值是[引用]传递。
克隆:新对象 = clone 旧对象
- 所有的引用属性仍然会是一个指向原来的变量的引用。
__clone()方法在对象被克隆时自动调用。
注意:构造方法对应实例化(new),克隆方法对应克隆(clone)。