在 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" 耦合了。