gpt4 book ai didi

Php,依赖注入(inject) - 杀死静态方法,但不需要 instatize

转载 作者:可可西里 更新时间:2023-11-01 00:32:58 25 4
gpt4 key购买 nike

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

class Mobile
{
public function getWeight()
{
return 4;
}
}

class User
{
public static function getWeight()
{
$mobile = new Mobile();
return $mobile->getWeight();
}
}

更新后,使用 DI:

class User
{
public $mobile;

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

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

最佳答案

是的,依赖注入(inject)使静态方法变得不必要,但您看不到它的原因是因为您的示例选择不当。

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

这个构造根是什么?每个应用程序都从一个静态的全局世界开始。 $_SERVER、$_GET 和 $_POST 中有请求信息,有请求的 URL,要么在中央文件中处理,要么指向各自的脚本文件。

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

这没问题,因为它们都被实例化了——可能是在依赖注入(inject)容器的帮助下。所以构建根是好对象的实例世界与每个请求的静态全局世界相遇的地方。最好准确指出此 session 发生的层,即在该层之外不应有任何静态调用。

本质上:如果您能够使用 DI 容器,您将在静态全局世界中配置它,然后,可能在 Controller 中,向它请求一个对象。这将创建所有需要的子对象,根据需要将它们全部注入(inject)彼此,并只返回您请求的主对象的一个​​实例。而且您无需担心如何注入(inject)所有这些其他对象 - 它们已经存在。

作为最后的评论:为什么静态调用不好?因为它们静态地将此调用与所使用的类链接起来。您不能仅仅通过传递实现相同接口(interface)或从相同父对象继承的不同对象来简单地将此调用替换为另一个类。您必须更改代码。

而您的 Java 示例 Math.max() 是不同的情况。在 PHP 中,这甚至不是一个对象,而只是一个全局函数。它之所以有效,是因为此函数不适用于任何对象实例 - 输入数据明确定义了函数的输出。

但是不要错误地将您创建的每个方法定义为仅适用于输入参数并将输出返回为静态。如果你有一个对象,享受它。 :)

关于Php,依赖注入(inject) - 杀死静态方法,但不需要 instatize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19478657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com