Php 什么';这是类常量和依赖注入的良好实践

Php 什么';这是类常量和依赖注入的良好实践,php,dependency-injection,constants,Php,Dependency Injection,Constants,假设我有以下代码 class MyLogger { const DEFAULT_KEY = 'DEF'; const USER_KEY = 'USE'; const BOOK_KEY = 'BOO'; //methods dealing with logs } abstract class Master { protected $log_key = MyLogger::DEFAULT_KEY; protected do_something

假设我有以下代码

class MyLogger 
{
    const DEFAULT_KEY = 'DEF';
    const USER_KEY = 'USE';
    const BOOK_KEY = 'BOO';

    //methods dealing with logs
}

abstract class Master 
{
    protected $log_key = MyLogger::DEFAULT_KEY;

    protected do_something() {
        MyLogger::log(static::$log_key,"message");
    }
}

class User extends Master 
{
    protected $log_key = MyLogger::USER_KEY;
}

class Book extends Master 
{
    protected $log_key = MyLogger::BOOK_KEY;
}
MyLogger负责处理应用程序的日志,每个日志都有一个键引用它来自的业务对象 Master有与所有孩子共享的方法,一个是创建日志 每个子项覆盖应使用的$log_键

现在我头痛,想把它修好
我可以在Master的构造函数中插入MyLogger,但我找不到最好的方法让每个孩子都使用正确的log_键,而不在每个孩子中导入MyLogger,只是为了能够获得键常量

为什么记录器首先需要了解其他单独的类?这是部件之间非常紧密的耦合,它们之间可能不应该相互了解。这是您提出的一个非常好的观点。我这样做的第一个原因是:使用常量而不是文字字符串,但我可能过度应用了这条准则第二个原因可能是懒惰:如果日志键因任何原因发生更改,那么一个更改是在常量中定义的,而不是在代码中追逐文字字符串,与我的示例相反,日志键并不表示类,而是表示业务概念/领域,可以在多个位置使用,但最终,与类的紧密耦合相比,在此处或此处使用文本字符串的成本可能更好。无论是使用常量还是字符串,关键是对于添加的每个类,您似乎还需要在
MyLogger
中添加一个常量。你在那里引入了一种似乎完全没有必要的双向关系。记录器应该以一种更通用的方式编写,这样它就不需要事先知道特定的类,而只需在运行时将所有这些信息(无论用于什么)作为参数即可。如果您有1000个不同的
Master
类,该怎么办;您还将在
MyLogger
上定义1000个常量?那太疯狂了。