PHP 魔术方法 - __call()
在 PHP 中如果调用一个不存在的方法会怎么样呢 ? 当然是直接报错了,例如下面的代码
<?php class Persion { private $name; private $age; private $sex; public function __construct($name="", $sex="Male", $age=22) { $this->name = $name; $this->sex = $sex; $this->age = $age; } } $person = new Person('Yufei'); // 调用一个不存在的方法 $person->setAge(30);
运行结果如下
[yufei@localhost php]$ php demo.php
Fatal error: Uncaught Error: Class 'Person' not found in /Users/yufei/php/demo.php:18
Stack trace:
#0 {main}
thrown in /Users/yufei/php/demo.php on line 18
直接提示方法不存在。
对于这种类私有成员 ( 属性 ),一般情况下我们都会创建一对 {get,set} 方法来获取或者设置它。有没有什么快速方式,只要创建一个函数就可以了呢
答案的结果就是魔术方法: __call()
__call() 方法函数原型
__call() 方法可以也只能用在类中,当调用类的对象的一个 不存在 的方法 ( 不存在或该方法不可访问 ) 时自动调用。
该方法有两个参数,第一个参数是调用的那个不存在的 方法名 ,第二个参数是一个数组 ( array ) ,是传递给不存在方法的所有参数组成的数组
__call() 方法的原型如下
__call( string $func_name, array $args )
{
// 一些代码
}
范例
下面的范例,我们给 Person 类定义了一个魔术方法 __call(),用于在调用不存在的方法时自动调用
<?php class Person { function say() { echo "你好,世界!\n"; } function __call($funName, $arguments) { echo "调用的方法名为:" . $funName . "(参数:" ; // 输出不存在的方法的名字 print_r($arguments); // 输出调用不存在方法的参数 echo ") 不存在!\n\n"; } } $person = new Person(); $person->run("yufei"); // 因为该方法不存在,所以会自动调用 __call() 方法 $person->eat("apple", "banana"); $person->play( 'football', $with='Hero'); $person->say(); // 方法存在时则不会调用 __call() 方法
运行以上示例,输出结果如下
[yufei@localhost php]$ php demo.php
调用的方法名为:run(参数:Array
(
[0] => yufei
)
) 不存在!
调用的方法名为:eat(参数:Array
(
[0] => apple
[1] => banana
)
) 不存在!
调用的方法名为:play(参数:Array
(
[0] => football
[1] => Hero
)
) 不存在!
你好,世界!
请注意调用不存在的方法时传递的参数和 __call() 第二个参数里的保存形式