PHP 魔术方法 - __callStatic()
在 PHP 魔术方法 - __call() 章节中我们介绍了 __call()
用于当调用一个对象存在的方法时自动调用。但是,该方法只能作用于对象上,如果调用的是类的方法 ( 静态方法,使用 static
关键字修饰 ) 则不会调用 __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->say();
运行结果如下
[yufei@localhost php]$ php demo.php 调用的方法名为:run(参数:Array ( [0] => yufei ) ) 不存在! Fatal error: Uncaught Error: Call to undefined method Person::eat() in /Users/yufei/php/demo.php:22 Stack trace: #0 {main} thrown in /Users/yufei/php/demo.php on line 22
调用 Person::eat()
的时候,__call()
方法也不好使了。
那么怎么办呢 ?
答案就是另一个 PHP 魔术方法 : __callStatic()
魔术方法 __callStatic()
魔术方法 __callStatic()
会在调用类的一个不存在的静态方法 ( 不存在或该方法不可访问 ) 时自动调用,作用和原型都类似于 __call()
该方法同样有两个参数,第一个参数是调用的那个不存在的静态方法名 ,第二个参数是一个数组 ( array ) ,是传递给不存在静态方法的所有参数组成的数组
__callStatic()
方法的原型如下
__callStatic( string $func_name, array $args ) { // 一些代码 }
范例
<?php class Person { function say() { echo "你好,世界\n"; } public static function __callStatic($funName, $arguments) { echo "你调用的静态方法:" . $funName . "( 参数:" ; // 输出静态方法名 print_r($arguments); // 输出调用静态方法时传递的参数 echo ") 不存在\n"; } } $person = new Person(); $person::run("teacher"); // 因为该静态方法不存在,所以会自动调用 __callStatic() $person::eat("apple", $with='Hero'); $person->say();
运行结果如下
[yufei@localhost php]$ php demo.php 你调用的静态方法:run( 参数:Array ( [0] => teacher ) ) 不存在 你调用的静态方法:eat( 参数:Array ( [0] => apple [1] => Hero ) ) 不存在 你好,世界