① __get/__set:将对象的属性进行接管
当访问一个不存在的对象属性时:
index.PHP
$obj = new \Common\Object();
会抛出一个错误:Notice: Undefined property: Common\Object::$title in D:\practise\PHP\design\psr0\index.PHP on line 9
当在Common/Object.PHP 中添加 __set 和 __get 方法后
Object.PHP
class Object{ function __set($key,$value){ }
function __get($key){
}
}
再执行 index.PHP,不会再报错。
class Object{ protected $array = array();
function __set($key,$value){
var_dump(METHOD);
$this->array[$key] = $value;
}
function __get($key){
var_dump(METHOD);
return $this->array[$key];
}
}
$obj = new \Common\Object();
$obj->title = 'hello'; echo $obj->title;
② __call/__callStatic:控制 PHP 对象方法的调用(__callStatic 用来控制类的静态方法)
index.PHP:
$obj = new \Common\Object();
执行 index.PHP 会报一个致命错误:Fatal error: Call to undefined method Common\Object::test() in D:\practise\PHP\design\psr0\index.PHP on line 9
如果在 Common/Object 中定义一个__call 方法,则会在方法不存在时自动回调:
class Object{ function __call($func,$param){ //$func 方法名 $param 参数 var_dump($func,$param); return "magic function\n"; //返回一个字符串作为返回值 } }
index.PHP
$obj = new \Common\Object();
Common/Object.PHP
class Object{ static function __callStatic($name,$arguments) { var_dump($name,$arguments); return "magic function\n"; //返回一个字符串作为返回值 } }
index.PHP
//执行一个不存在的静态方法 echo Common\Object::test("hello",1234);
③ __toString:将一个 PHP 对象转换成一个字符串
index.PHP
$obj = new \Common\Object();
echo $obj;
此时会报错: Catchable fatal error: Object of class Common\Object could not be converted to string in D:\practise\PHP\design\psr0\index.PHP on line 8
在 Object.PHP 中添加 __toString 方法
class Object{ function __toString() { return __CLASS__; } }
④ __invoke:将一个 PHP 对象当成一个函数来执行时,会回调此魔术方法
index.PHP
$obj = new \Common\Object();
echo $obj("test");
class Object{ function __invoke($param) { var_dump($param); return 'invoke'; } }