我想在不初始化类的情况下调用它,即使它通常不是静态的。所以基本上它应该用第一个方法调用来初始化自己。
我想知道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
是传递给方法的参数数组(上面的1
、2
和foo
)