PHP - 带有静态函数的init类

时间:2015-04-03 22:52:23

标签: php laravel

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

我想知道laravel是如何做到的:

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

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

我用Google搜索了很长时间,但只要您不知道这种行为的名称,就很难找到。

如果能帮助我,那会很好。

2 个答案:

答案 0 :(得分:2)

Laravel(有时)将此功能称为" Facade" - 解释如何在Laravel中完成这意味着以方式沿着Laravel兔子洞走下去并超出单一Stack Overflow答案的范围 - 如果你对我感兴趣的话。作为10篇文章系列的作者covers the implementation details of a lot of Laravel's "magic" methods - 值得一试,如果你喜欢那种喜欢那些细节的细节。 PHP手册条目on overloading也很有用。

简短版本是,所有PHP类都有一个名为__callStatic的魔术方法。如果您的班级已定义__callStatic

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

调用一个不存在的方法,或者是受保护的/私有的

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

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

答案 1 :(得分:2)

正如已经提到的,它都在源代码中。看一下Illuminate\Database\Eloquent\Model班级(Github link

的这一部分
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调用该方法。