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()
第二个参数里的保存形式