带有静态函数的PHP-init类


PHP - init class with a static function

我想在不初始化类的情况下调用它,即使它通常不是静态的。所以基本上它应该用第一个方法调用来初始化自己。

我想知道laravel是怎么做到的:

$someClass = SomeClass::where()->get()

这适用于他们提供的每一种方法。

我在谷歌上搜索了很长时间,但只要你不知道这种行为的名字,就很难找到。

如果你能帮我就好了。

如前所述,它都在源代码中。看看Illuminate'Database'Eloquent'Model类(Github链接)的这一部分

public static function __callStatic($method, $parameters)
{
    $instance = new static;
    return call_user_func_array(array($instance, $method), $parameters);
}

每一个不存在方法的静态方法调用(在模型类上可以静态调用的大多数方法都是这样)都将以__callStatic结束。

然后,使用new static,将创建该类的一个实例,并使用call_user_func_array调用该方法。

Laravel(有时)将此功能称为"Facade"——解释如何在Laravel中实现这一功能意味着进入Laravel兔子洞,并且超出了单个Stack Overflow答案的范围——如果你对此感兴趣的话,我是一个10篇系列文章的作者,该系列文章涵盖了Laravel的许多"神奇"方法的实现细节——值得一看如果你是那种喜欢这些细节的人。关于重载的PHP手动输入也很有用。

简短的版本是,所有PHP类都有一个名为__callStatic的神奇方法。如果你的班级有__callStatic定义的

class Foo
{
    public function __callStatic($method, $args)
    {
    }
}

并且您调用了一个不存在或受保护/私有的方法

Foo::notThere(1,2,'foo');

然后PHP将调用__callStatic方法,$method是方法的名称(上面的notThere),$args是传递给方法的参数数组(上面的12foo