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
)
) 不存在
你好,世界
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.