//声明一个类MagicTest
class MagicTest{
protected $arr = new array();
//__set()和__get()
public function __set($key,$value){
$arr[$key] = $value;
}
public function __get($key){
return this->$arr[key];
}
public function __isset($name){
echo "__isset invoked
";
return false;
}
public function __unset($name){
echo "unsetting property " . $name;
}
//__call()和__callStatic()
public function __call($name, $arguments){
echo "calling ".$name."with parameters: ".implode(',',$arguments);
}
public static function __callStatic($name,$arguments){
echo "calling static function: ".$name."with parameters: ".implode(',',$arguments);
}
//__tostring()和__invoke()
public function __tostring(){
}
public function __invoke($name){
}
}
$obj = new MagicTest();
$obj->val = test;//__set($key,$value)被调用
echo $obj->val;//__get()被调用
isset($obj->value);
empty($obj->value);//isset($name)被调用
unset($obj->value);//unset($name)被调用
$obj->runtest(param1,param2);//__call($name,$arguments)被调用
MagicTest::runtest(param1,param2,param3); //__callStatic($name,$arguments)被调用
echo $obj; //tostring()被调用
$obj(param); //invoke($name)被调用
$obj2 = clone $obj;//__clone被调用
魔术方法之属性重载
1. 在给不可访问属性赋值时,__set() 会被调用。
2. 读取不可访问属性的值时,__get() 会被调用。
3. 当对不可访问属性调用 isset() 和empty()时,__isset() 会被调用。
4. 当对不可访问属性调用 unset() 时,__unset() 会被调用
__set();
__get();
魔术方法之方法重载
1. 当对象访问不存在的方法名称时,__call()方法会被自动调用
2. 当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用
__call();
__callStatic();
魔术方法
1. 当对象被当做String使用时,__tostring()会被自动调用
2. 当对象被当成方法调用时,__invoke()会被自动调用
__tostring()
__invoke()
魔术方法之__clone():