public void __set(string $name,mixed $value) 在给末定义的变量赋值时,__set()会被调用
public mieed __get(string $name) 读取末定义的变量的值时__get会被调用
public bool __isset(string name) 当对末定义的变量调用isset()或empty()时,__isset()会被调用
public void __unset(string name)当对末定义的变量调用unset时 __unset会被调用
注意:参数$name是指要操作的变量的名称 __set()方法的$value参数指定了$name变量的值
属性重载只能在对象中进行,在静态方法中,这些魔术方法不会被调用,所以这些方法都不能被声明为static
在除isset外的其它语言结构中无法使用重载的属性, 这意味着当对一个重载的属性使用empty时,重载魔术方法将不会被调用。 为避开此限制,可以将重载属性赋值到本地变量再使用empty
__get()和__set() 可以被继承,子类中__get()和__se()t可以继承父类的__get()和__set()
例子:
<?
class PropertyTest{
//被重载的数据保存在数组中
private $date=array();
//重载不能被用在已经定义的属性
public $declared=1;
//只用从类外部访问这个属性,重载才会发生
private $hidden=2;
public function __set($name,$value){
echo "setting '$name'to '$value'\n";
$this->date[$name]=$value;
}
public function __get($name){
echo "getting '$name'\n";
if(array_key_exists($name,$this->date)){
return $this->date[$name];
}
$trace=debug_backtrace();
trigger_error('unsigned property via_get():'.$name.'in'.$trace[0]['file'].'on line'.$trace[0]['line'],E_USER_NOTICE);
return null;
}
public function __isset($name){
echo "is'$name'set?\n";
return isset($this->date[$name]);
}
public function __unset($name){
echo "unsetting'$name'\n";
unset($this->date[$name]);
}
public function getHidden(){
return $this->hidden;
}
}
echo "<pre>\n";
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
?>
public mixed __call(string $name,sting $arguments) 当调用一个不可访问方法(如末定义,或不可见)时,__callstatic会被调用
public static mixed __callstatic (string $name.array $arrguments)
当在静态方法中调用一个不可访问的方法(如末定义或者不可见)时 __callstatic 会被调用
$name 参数是要调用的方法名称,$arraguments 参数是一个数组,包含着传递给方法的参数
例子
class MethodTest{
public function __call($name,$arguments){
echo "calling object method '$name'".implode(',',$arguments)."\n";
}
public static function __callStatic($name,$arguments){
echo "calling static method '$name'".implode(',',$arguments)."\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context');
public array __sleep(void) serialize()函数会检查是否存在一个魔术方法,如果存在__sleep(),__sleep()方法会先被调用,然后才执行序列化操作,这个功能可以用于清理对象,并返回一个包含对象中所有应被徐立华的变量名称的数组。如果方法不返回任何内容,则null 被序列化,并产生一个E_NOTICE错误
__sleep()方法用于提交未提交的数据,或类似的清理操作,同时,如果有一些很大的对象,不需要全部保存,这个功能就好用
unserialize()会检查是否存在一个_wakeup()方法,如果存在,则会先通用__wakeup方法,预先准备对象需要的资源
__wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其他初始化操作
__string()会在需要转成字符串时,在php内部会隐式自动调用它,进行对象类型的转化
__invoke()
当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用
__set_state()
当调用var_export()时,这个静态方法会被调用,本方法的唯一的参数就是数组