【发布时间】:2023-04-07 22:35:01
【问题描述】:
PHP 有一个magic 方法__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 代码,但我认为它们会在应用程序的其他位置创建实例,并将它们存储在准备返回的类成员中。
【问题讨论】:
-
"这使用了静态方法无法完成的方法链接" --- 它只返回一个对象。 “方法链接”不是魔术,它只是调用对象的方法。无论如何,你的想法很糟糕——不要那样做
-
@zerkms 方法链接在方法中返回对象的当前实例,以便可以直接调用另一个方法。这不能用静态方法完成,因为在 PHP 中你不能返回
self- 静态类 -
@zerkms 为什么这么可怕?
-
@Petah:因为静态处理起来更复杂。应尽可能避免静态本身(总是)
标签: php singleton static-members