Php,依赖注入-杀死静态方法,但不需要不稳定

Php,依赖注入-杀死静态方法,但不需要不稳定,php,dependency-injection,Php,Dependency Injection,这是一个基本的类构造,在使用DI之前(我知道,它的结构有点不正确,请试着关注这个问题) 续订后,使用DI: class User { public $mobile; public function getWeight() { return $this->mobile->getWeight(); } } 如果我们检查一下,使用getWeight()不需要有User的实例,因为它是静态的-创建它的实例是毫无意义的。 但是现在,getWe

这是一个基本的类构造,在使用DI之前(我知道,它的结构有点不正确,请试着关注这个问题)

续订后,使用DI:

class User
{
    public $mobile;

    public function getWeight()
    {
        return $this->mobile->getWeight();
    }
}
如果我们检查一下,使用
getWeight()
不需要有
User
的实例,因为它是静态的-创建它的实例是毫无意义的。 但是现在,
getWeight()
不能是静态的,所以无论如何都需要一个实例——因为依赖项注入!当然,我知道这个例子有点笨拙——我只想指出依赖注入杀死静态方法的逻辑,但有时静态方法需要,因为拥有一个类的实例是毫无意义的,只要想想JAVA
Math.max()
method。
如何解决这个问题?

是的,依赖项注入使静态方法变得不必要,但您之所以看不到它,是因为您的示例选择不当

静态方法仍然可以使用。但它们不应在应用程序的构造根点之外使用

这个构造根是什么?每个应用程序都从一个静态的全局世界开始。在$\u SERVER、$\u GET和$\u POST中有请求信息,还有一个请求的URL,该URL在中心文件中处理,甚至指向相应的脚本文件

然后,我们实现了模型、业务逻辑、表单验证的实用对象、模板等等——如果做得好,这些都没有静态方法,但都需要实例化

这没有问题,因为它们都被实例化了——可能是在依赖项注入容器的帮助下。因此,构造根是好对象的实例世界满足每个请求的静态全局世界的地方。准确地指出会议发生的确切层是一个很好的实践,也就是说,在该点之外不应该有静态调用

本质上:如果您能够使用DI容器,您将在静态全局世界中配置它,然后,可能在控制器中,向它请求对象。这将创建所有需要的子对象,根据需要将它们相互注入,并只返回您请求的主对象的一个实例。您不必担心如何注入所有其他对象——它们已经存在了

最后一句话:为什么静态调用不好?因为它们将此调用与所使用的类静态链接。不能仅仅通过传递实现同一接口的不同对象或从同一父对象继承来用另一个类替换此调用。你必须改变密码

而Java的
Math.max()
示例则是另一种情况。在PHP中,这甚至不是一个对象,而是一个全局函数。它之所以有效,是因为这个函数不处理任何对象的实例——输入数据明确地定义了函数的输出


但是,不要错误地定义您创建的每个只对输入参数起作用并以静态形式返回输出的方法。如果你有一件物品,请尽情享受。:)

这没关系,但是我仍然不明白为什么仅仅因为依赖注入就让一个方法成为非静态的。要点是:如果你做依赖注入,你不必使用静态方法(你仍然可以,但是你很快就会体验到它带来的痛苦)。再也没有必要了,因为DI提供了您所需要的所有对象。可以将对象创建与对象使用分开。静态方法调用在某种程度上是两者兼而有之。您隐式地创建并访问了“god”类“object”,即承载静态方法的单个实例。@Sven-听起来像是单例模式?例如,假设我们需要静态方法中的依赖项(
MyClass::new(params)
-将项目保存到数据库),如果无法通过构造函数的参数实例化数据库连接/链接,那么向静态方法传递数据库连接/链接的最佳方式是什么?很抱歉,在此拒绝您,但这个问题最好用新的思路来回答,因为它需要更多的说明和例子,而不是放在评论中(答案也是如此)。
class User
{
    public $mobile;

    public function getWeight()
    {
        return $this->mobile->getWeight();
    }
}