PHP的重载是指动态的创建类属性和方法。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。所有的重载方法都必须被声明为public的。PHP的重载是通过魔术方法实现的。
属性重载
属性重载只能在对象中进行,在静态方法中不会调用这些魔术方法。所以这些方法不能被声明为static的,否则从PHP5.3起,会产生一个警告。
__set:在给不可访问属性赋值时,会调用此方法。
__get:读取不可访问属性时,会调用此方法。
__isset:PHP5.1起,在对不可访问的属性调用isset或empty函数时,会调用此方法。
__unset:PHP5.1起,在对不可访问属性调用unset函数时,会调用此方法。
<?php
class A{
private $data = array();
public $var="a";
private $var2="a2";
function __set($name,$value){
echo "invoke __set\n";
$this->data[$name]=$value;
}
function __get($name){
echo "invoke __get\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}else{
return null;
}
}
function __isset($name){
echo "invoke __isset\n";
return isset($this->data[$name]);
}
function __unset($name){
echo "invoke __unset\n";
unset($this->data[$name]);
}
}
$a=new A();
$a->var3="a3";
echo "$a->var3\n";
var_dump(isset($a->var3));
unset($a->var3);
var_dump(empty($a->var3));
?>
方法重载
__call:在对象中调用一个不可访问方法时,会调用此方法。
__callstatic:PHP5.3起,在静态上下文中调用一个不可访问方法时,会调用此方法。此方法必须声明为public、static的。
<?php
class A{
function __call($name,$args){
var_dump($args);
echo "invoke $name with (",join(",",$args),")\n";
}
static function __callstatic($name,$args){
var_dump($args);
echo "invoke static $name with (",join(",",$args),")\n";
}
}
$a=new A();
$a->test("a","b","c");
A::test("a","b","c");
?>