_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情况 ----------
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的是这个继承的类名,于是有,如下伪代码:
运行结果:
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");
?>
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
评论列表