PHP 有一个神奇的方法__getStatic()
,它允许重载静态方法调用。我有一个具有流畅接口的类,可以执行完整性检查。我这样称呼它:-
$check = new CheckSomeCondition();
$check->forActive()->sites(array(1,2,3))->check();
但是,我想这样称呼它:-
CheckSomeCondition::forActive()->sites(array(1,2,3))->check();
我认为在我的基类中使用这种神奇的方法可以让我这样做:-
public static function __callStatic($method, $args)
{
$instance = new self();
return call_user_func_array(array($instance, $method), $args);
}
但是new self()
产生了调用代码所在类的实例,而不是__callStatic()
存在的类,这是为什么呢?我怎样才能绕过它?
我也试过new static
,这做同样的事情。
我知道这一定是可能的,因为 Laravel 的 QueryBuilder 有一个类似的接口DB::table()->...
,它使用方法链接,返回对象实例,而不是静态类。我查看了 Laravel 代码,但我认为它们在应用程序的其他位置创建实例,并将它们存储在准备返回的类成员中。