gpt4 book ai didi

PHP 依赖注入(inject) - Pimple 等。 - 为什么使用关联数组与 getter?

转载 作者:IT王子 更新时间:2023-10-29 00:12:44 26 4
gpt4 key购买 nike

我们正在考虑将依赖注入(inject)容器集成到我们的项目中。我看过的每个 DIC 都使用关联数组和/或魔法方法。例如,这是来自 Pimple 页面的示例:

$container['session_storage'] = function ($c) {
return new $c['session_storage_class']($c['cookie_name']);
};

$container['session'] = function ($c) {
return new Session($c['session_storage']);
};

这是有原因的吗?我讨厌在我的代码中将字符串作为将要显示在某处的文字字符串以外的任何内容。您失去了 IDE 的太多功能(这使代码更难维护,这是我们试图避免的事情!)。

我的偏好更像是:

class Container {

function getSessionStorage()
{
return new $this->getSessionStorageClass($this->getCookieName);
}

function getSession()
{
return new Session($this->getSessionStorage());
}

}

有理由不这样做吗?如果我们走这条路,我是否错过了 Pimple 的一些魔力?

最佳答案

Pimple 中 ArrayAccess 扩展的“魔力”在于它是完全可重用和可互操作 的。 Pimple 作为 DIC 的一大特点是定义的服务可以使用以前定义的服务和/或参数。假设(无论出于何种原因)您有一个需要 Filter 实例的 Session 对象。没有 DIC 你可以写:

$session = new Session(new Filter);

有了疙瘩你可以写:

$pimple['filter'] = function($c) {
return new Filter;
};
$pimple['session'] = function($c) {
return new Session($c['filter']);
}

Pimple 在 Session 对象的实例化中使用先前注册的“过滤器”服务。对于实现 ArrayAccess 的 DIC,此优势并非独一无二,但可重用性对于代码重用和共享非常有用。您当然可以对某些服务或所有服务的 getter/setter 进行硬编码,但可重用性的好处几乎完全丧失。

另一种选择是使用魔术方法作为 getters/setters。这将为 DIC 提供一个更像您在代码中想要的 API,您甚至可以将它们用作 Pimple ArrayAccess 代码的包装器(尽管您最好编写一个专门构建的 DIC在那时候)。包装 Pimple 的现有方法可能看起来像这样:

public function __call($method, $args) {
if("set" === substr($method, 0, 3)) {
return $this[substr($method, 3)];
}
if("get" === substr($method, 0, 3) && isset($args[0])) {
return $this[substr($method, 3)] = $args[0];
}
return null;
}

您还可以使用 __set__get 来提供对 DIC 中服务和参数的类对象访问,就像这样:(仍然包裹着 Pimple 的 ArrayAccess 方法)

public function __set($key, $value) {
return $this[$key] = $value;
}

public function __get($key) {
return $this[$key];
}

除此之外,您还可以完全重写 DIC 以专门使用魔术方法,并使用类似对象的 API 语法而不是实现 ArrayAccess,但这应该很容易弄清楚:]

关于PHP 依赖注入(inject) - Pimple 等。 - 为什么使用关联数组与 getter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14813504/

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