在提到__call之前,先来看一个实例的测试结果,以便更好地去了解__call方法的作用。上代码:
在调用对象中不存在的方法时就会出现系统报错,然后程序退出不能继续执行。如果在类中添加一个“魔术”方法__call(),则调用对象中不存在的方法时就会自动调用该方法,并且程序可以继续向下执行。可以通过在__call()方法中的设置,提示用户调用的方法及需要的参数列表内容不存在。__call()方法需要两个参数,第一个参数是调用不存在的方法时,接受这个不存在的方法的方法名,并将这个不存在的方法中,使用的参数列表形成数组传给__call()方法中的第二个参数。
代码
代码如下 | 复制代码 |
//这是一个测试的类,里面没有属性和方法
$test=new Test();
$test->demo("one", "two", "three");
echo "this is a test
|
运行结果:Fatal error: Call to undefined method Test::demo()
我们知道,程序的运行结果抛出了错误提示,在运行的过程中抛出错误后就已经中断了,以致”$Person->say();“这个正确的方法也不能再继续运行。看一下上面的代码就知道,Person类并没有代码错误,错就错在实例化Person类的过程中调用了Person类中并不存在的方法,如run()和eat()。
在程序的运行中,出现如上抛出的的错误是致命性的,整个程序将崩溃。为了处理这种错误的同时让程序继续执行,我们可以在类中添加一个魔术方法__call,来调用对象中不存在的方法时自动调用该方法,并且使程序可以继续向下执行。
下面将在上面的代码的基础上多添加一个__call方法并调试,代码如下:
代码
代码如下 | 复制代码 |
//这是一个测试的类,里面没有属性和方法 //调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数 function __call($function_name, $args) print "你所调用的函数:$function_name(参数:"; print_r($args); echo "不存在! } }
$test=new Test();
$test->demo("one", "two", "three");
echo "this is a test ?> 运行结果: 你所调用的函数:run(参数:Array ( [0] => teacher ) )不存在! 你所调用的函数:eat(参数:Array ( [0] => child [1] => apple ) )不存在! Hello, wblog! |
这次程序的运行结果不再抛出致命性错误,在调用不存在的方法时自动调用了__call方法捕捉处理不存在的方法并提示给用户,而调用存在的方法时程序正常执行。
总结:在类中添加一个魔术方法__call,在调用对象中不存在的方法时就会自动调用该方法,并且程序可以继续向下执行。
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔