在 class 方法中使用由框架定义的全局常量是否会破坏依赖注入原则?
Does using a global constants defined by framework within class methods breaks the Dependency Injection principle?
使用来自您正在使用的框架的常量。即,ABSPATH
在 WordPress 中。
如果我不将该常量的值作为依赖添加到 class 的 constructor
函数中,而是直接在方法内部使用它,它会严重破坏依赖注入原则吗?
说,严格的 DI 来说,你需要做这样的事情:
class Foo {
private $abspath;
public function __construct(string $abspath) {
$this->abspath = $abspath
}
public function get_assets_dir() {
return $this->abspath . '/assets/';
}
}
$foo = new Foo(ABSPATH);
$foo->get_assets_dir();
而是类似的东西?
class Foo {
public function __construct() {
//nothing here.
}
public function get_assets_dir() {
return ABSPATH . '/assets/';
}
}
如果它始终被定义,我真的还必须这样做吗,因为它位于默认定义它的框架之上?
严格来说,是的。 (虽然它被称为 "Dependency Inversion Principle",而不是 "Dependency Injection" 原则。"Dependency Injection Pattern" 它是 "Inversion of Control" 原则的子模式;相关但不相同。阅读更多关于这个 here.
ABSPATH
是您的 Foo
class 的依赖项,它由应用程序的不同部分在外部定义。如果你的 class 需要那个值,并且旨在与 "framework" 完全分离,你应该注入它(忽略常量属于全局状态,如果你真的封装你的 class, 它不需要知道这一点)。
实际上,如果您的 class 仅用于 Wordpress(看起来就是那样),我不会太担心。反正你已经和你的 "framework" 耦合了。
使用来自您正在使用的框架的常量。即,ABSPATH
在 WordPress 中。
如果我不将该常量的值作为依赖添加到 class 的 constructor
函数中,而是直接在方法内部使用它,它会严重破坏依赖注入原则吗?
说,严格的 DI 来说,你需要做这样的事情:
class Foo {
private $abspath;
public function __construct(string $abspath) {
$this->abspath = $abspath
}
public function get_assets_dir() {
return $this->abspath . '/assets/';
}
}
$foo = new Foo(ABSPATH);
$foo->get_assets_dir();
而是类似的东西?
class Foo {
public function __construct() {
//nothing here.
}
public function get_assets_dir() {
return ABSPATH . '/assets/';
}
}
如果它始终被定义,我真的还必须这样做吗,因为它位于默认定义它的框架之上?
严格来说,是的。 (虽然它被称为 "Dependency Inversion Principle",而不是 "Dependency Injection" 原则。"Dependency Injection Pattern" 它是 "Inversion of Control" 原则的子模式;相关但不相同。阅读更多关于这个 here.
ABSPATH
是您的 Foo
class 的依赖项,它由应用程序的不同部分在外部定义。如果你的 class 需要那个值,并且旨在与 "framework" 完全分离,你应该注入它(忽略常量属于全局状态,如果你真的封装你的 class, 它不需要知道这一点)。
实际上,如果您的 class 仅用于 Wordpress(看起来就是那样),我不会太担心。反正你已经和你的 "framework" 耦合了。