一.魔术方法
像__construct(), __clone()方法一样,在特定时刻自动被调用的方法,用于完成某个特定功能的方法,称之为魔术方法,例如:
__construct()
实例化new,初始化对象
__destruct()
对象被销毁,收尾工作
__clone()
克隆clone,重设新对象
__toString()对象转换字符串调用
__invoke()匿名函数:对象当函数调用,只有重写了__invoke()才能对象当成函数调用。
等。。。
二.php的重载(重新加载)
不同于其他语言的重载,这里指的是:php允许对对象的不可访问的成员行处理,这种处理就是重载。不可访问指的是:不存在和访问限制。
1.属性重载
例如对对想进行增加,修改属性时会调用__set()魔术方法.
进行访问属性会调用__get()魔术方法。以及判断属性是否存在和删除属性分别会调用__isset()和__unset()魔术方法。
2.方法重载
同样是访问一个不访问的方法是调用__call()以及静态方法被重载触发的__callStatic().
如代码
Class student{
private $age;
private $name;
private $sex;
public function __set($name,$value){
$allow_set = array('age','name');
if(in_array($name, $allow_set)){
$this->$name = $value;
}else{
echo "该属性".$name."你没有权限操作";
}
}
public function __get($name){
$allow_set = array('age','sex');
if(in_array($name, $allow_set)){
return $this->$name;
}
}
public function __isset($name){
$allow_set = array('age','sex');
if(in_array($name, $allow_set)){
return true;
}
else return false;
}
public function __unset($name){
$allow_set = array('age');
if(in_array($name, $allow_set)){
unset($this->$name);
}
}
}
三、遍历对象
foreach(),以及自定义迭代器,需要类实现Iterator接口,分别rewind()初始化,valid()判断是否合法,current()获得键,key()获得值,next()指针移动。同样遍历对象操作也要注意访问限定符。
四、序列化与反序列化
File_put_contents(‘./data’,$ser_data)写入文件
File_get_contents(‘./data’)读取文件
数据保存需要保存数据的类型以及值,可以使用序列化serialize(),访问时使用反序列化unserialize(),所有的数据类型都可以序列化和反序列化,但是资源类型语法上可以但是得不到正确结果。
反序列化是需要导入对象的定义,不然所得对象会是__PHP_Incomplete_Class对象。
1.__sleep()魔术方法对象再被序列化时可以决定那些属性被序列化而那些不被
2.__wakeup()魔术方法 在反序列化时可以对属性进行重新初始化
五、魔术常量以及相关函数
CLASS 类名,所在类名
METHOD 方法名,所在方法名
FUNCTION 函数名
Class_exists()类是否存在
Interface_exists()接口是否存在
Method_exists()方法是否成
Property_exists()属性是否存在
get_class_vars();得到类的所有成员变量(属性)
get_class_methods();得到类的所用成员方法
Get_class()得到对象的所属类
Get_called_class();得到当前的调用类名
面向对象思想三大特征
1.封装
2.继承
3.多态