0

如何访问绑定的静态函数?甚至可能吗?

到目前为止有效的是:

在 serviceProvider boot() 方法中:

$this->app->bind('MyInterface', function(){

                return new MyImplementation();
            });

或通过 laravel 中的反射事物(工作方式相同):

$this->app->bind('MyInterface', 'MyImplementation');

然后在我的业务逻辑中:

$interfaceObject = app::make('MyInterface');
$interfaceObject->create();

什么不起作用:

如果 create() 函数在绑定的实现类中是静态的,那么我不能这样做:

MyInterface::create();

我该怎么做呢?外观不应该是解决方案,因为外观将“假”静态方法映射到真实对象,对吗?

4

1 回答 1

0

对静力学的理解是你真正需要的。当您开始深入研究 OOP 时,静态函数确实不好。在 Laravel 3 中,可以在大多数类上使用静态,因为静态外观主要是通过__callStatic魔术方法以及一些设计良好的实现来提供的,例如Eloquent. 使用静态在模型上构建助手也是有意义的,尽管即使 Taylor Otwell 在文档中描述了关注点分离是一种更好的策略,它创建存储库、服务和实体而不是通用“模型”。

当您开始研究继承,特别是依赖注入时,静态变量更难使用,因为它们紧密耦合使用您的具体类的代码。如果您考虑一下,出于这个原因,一个具体的实现并不真正需要绑定到它的静态方法。一种可能的解决方法是为使用静态的具体实现创建一个新的外观,尽管它确实为您提供了一个更松散的模式来使用,但这仍然不是好的 OOP 实践。在我看来,这仍然是一种反模式。

也就是说,您可以在界面中构建静态。

interface AnInterface {

    public static function takeArgAndReturnSomething($arg);

}

显然,实现这个接口的具体类需要这样的静态,因此 Laravel 应该能够通过控制绑定的反转来管理静态调用。

总之,在这些情况下,我会尽量避免使用静力学。

于 2013-09-10T19:19:28.900 回答