PHP魔术方法的使用示例
① __get/__set:将对象的属性进行接管当访问一个不存在的对象属性时: index.php 代码如下: $obj = new CommonObject(); //在php中访问一个不存在的对象属性时 echo $obj->title; 会抛出一个错误:Notice: Undefined property: CommonObject::$title in D:practisephpdesignpsr0index.php on line 9 当在Common/Object.php 中添加 __set 和 __get 方法后 Object.php 代码如下: class Object{ function __set($key,$value){ } function __get($key){ 再执行 index.php,不会再报错。 再次修改 Common/Object.php 代码如下: class Object{ protected $array = array(); function __set($key,$value){ function __get($key){ 代码如下: $obj = new CommonObject(); $obj->title = 'hello'; echo $obj->title; 执行 index.php,页面输出: 代码如下: ② __call/__callStatic:控制 PHP 对象方法的调用(__callStatic 用来控制类的静态方法)当执行一个不存在的php方法时 index.php: 代码如下: $obj = new CommonObject(); //当执行一个不存在的php方法时 $obj->test('hello',123); 执行 index.php 会报一个致命错误:Fatal error: Call to undefined method CommonObject::test() in D:practisephpdesignpsr0index.php on line 9 如果在 Common/Object 中定义一个__call 方法,则会在方法不存在时自动回调: 代码如下: class Object{ function __call($func,$param){ //$func 方法名 $param 参数 var_dump($func,$param); return "magic functionn"; //返回一个字符串作为返回值 } } index.php 代码如下: $obj = new CommonObject(); //当执行一个不存在的php方法时 echo $obj->test('hello',123); 页面输出: 代码如下: string 'hello' (length=5)
1 => int 123
magic function
当调用一个不存在的静态方法时 Common/Object.php 代码如下: class Object{ static function __callStatic($name,$arguments) { var_dump($name,$arguments); return "magic functionn"; //返回一个字符串作为返回值 } } 注意:__callStatic 方法也要声明成静态方法 index.php 代码如下: //执行一个不存在的静态方法 echo CommonObject::test("hello",1234); 执行 index.php ,页面输出: 代码如下: string 'hello' (length=5)
1 => int 1234
magic function
③ __toString:将一个 PHP 对象转换成一个字符串index.php 代码如下: $obj = new CommonObject(); echo $obj; 此时会报错: Catchable fatal error: Object of class CommonObject could not be converted to string in D:practisephpdesignpsr0index.php on line 8 在 Object.php 中添加 __toString 方法 代码如下: class Object{ function __toString() { return __CLASS__; } } ④ __invoke:将一个 PHP 对象当成一个函数来执行时,会回调此魔术方法index.php 代码如下: $obj = new CommonObject(); echo $obj("test"); 代码如下: class Object{ function __invoke($param) { var_dump($param); return 'invoke'; } } 页面输出: 代码如下: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |