PHP Laravel Facade __callStatic参数列表

Ozz*_*zzy 6 php optimization arguments laravel

不确定如何准确地标题.在深入了解Laravel 4课程以了解外墙是如何工作的时候,我偶然发现了这个问题:

Illuminate\Support\Facades\Facades.php@__callStatic

public static function __callStatic($method, $args)
{
    $instance = static::getFacadeRoot();

    switch (count($args))
    {
        case 0:
            return $instance->$method();

        case 1:
            return $instance->$method($args[0]);

        case 2:
            return $instance->$method($args[0], $args[1]);

        case 3:
            return $instance->$method($args[0], $args[1], $args[2]);

        case 4:
            return $instance->$method($args[0], $args[1], $args[2], $args[3]);

        default:
            return call_user_func_array(array($instance, $method), $args);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以告诉这个方法调用Facade引用的类的任何给定方法并传递参数.我错了,但这是我迄今为止的理解.

真正让我烦恼的部分是转换.

为什么在默认情况下无论如何都需要从0到4的情况.

如果没有参数,即使案例0种有意义,为什么还有案例1-4而不仅仅是继续案例10.对此有合理的论据,还是只是过早优化的情况?

Jef*_*ert 5

我怀疑这是微观优化。我还会怀疑,对外观的这些静态调用中的大多数将需要4个或更少的参数,在这种情况下,大多数静态调用不会跳入默认情况。

我可以call_user_func_array从“ no dot at com” 手动输入中找到此用户提交的报价:

对于那些不得不考虑性能的人:用这种方法调用该函数的时间大约是通过一条直线语句花费的时间的三倍,因此,只要有可能,避免使用此方法,这样做是一个明智的主意。

做一个非常简单的基准似乎也证实了这一点的有效性。结果中,1直接在实例上调用方法,2在实例上调用变量方法名称,3使用call_user_func_array,输出时间以秒为单位。每种方法的迭代次数为1,000,000。

$ php test.php  
(1) total: 0.51281404495239 
(2) total: 0.51285219192505 
(3) total: 1.1298811435699 
$ php test.php  
(1) total: 0.49811697006226 
(2) total: 0.5209321975708 
(3) total: 1.1204349994659 
$ php test.php  
(1) total: 0.48825788497925 
(2) total: 0.51465392112732 
(3) total: 1.156769990921
Run Code Online (Sandbox Code Playgroud)

上面的结果表明,避免使用该call_user_func_array方法至少可以使对静态外观方法的调用加速至少2倍,除非该静态方法具有四个以上的参数。

至于为什么选择4个参数的截止数,只有泰勒知道。自Laravel 4.0的第一次commit以来,该方法一直(大部分)未更改,我怀疑它在某种程度上是任意的。