[实践OK]PHP5学习笔记之PHP魔法函数:__call()  ,以及用__call()实现方法重载 。

jackxiang 2010-3-17 19:22 | |
_call()函数是php类的默认魔法函数,__call() 在一个对象的上下文中,如果调用的方法不能访问,它将被触发,可以用它来做重载,如果一个类的方法不存在,则需要重新加载一次。



运行结果:
Calling object method 'runTest' in object context
以上来自:
http://blog.163.com/lgh_2002/blog/static/4401752620105256371802/

用__call()实现方法重载 :

<?php
class foo {
  function __call($name,$arguments) {
    print("Did you call me? I'm $name!");
    print_r($arguments);
  }
} $x = new foo();
$array = array(1,2,2,1984);
$x->doStuff("dfdf");
$x->fancy_stuff($array,"777");
?>


Did you call me? I'm doStuff!Array ( [0] => dfdf ) Did you call me? I'm fancy_stuff!Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 1984 ) [1] => 777 )

$arguments 0,1,2,3 分别对应如果没有该函数的三个函数参数。
$name表示缺失的函数名称!

使用 __call 实现“过载”动作
<?php
class Magic {
  function __call($name,$arguments) {
    if($name=='foo') {
  if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
  if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
    }
  }   private function foo_for_int($x) {
    print("oh an int!");
  }   private function foo_for_string($x) {
    print("oh a string!");
  }
} $x = new Magic();
$x->foo(3);
$x->foo("3");
?>



---------- 调试PHP情况 ----------
456
not_exist_fun is called but not exist,U can do it by yourselft.
方法不存在

————————————————————————————————————————————————————————
如果在框架里用它,是这样的,PHP5里有一个反射函数,进行autoload进相关文件,后对该类的Obj进行:Obj->fun();
如果这个fun不存在就调用这个__call,这个call是上层类,其autoload时new的是这个继承的类名,于是有,如下伪代码:

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2834/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2013-9-25 14:21
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]