Php 如何从Symfony控制台应用程序中的类登录

Php 如何从Symfony控制台应用程序中的类登录,php,symfony,symfony-console,Php,Symfony,Symfony Console,在阅读文档和示例时,我发现LoggerInterface通过依赖项As的构造函数传递,这允许依赖项输出到控制台 我的问题是: 如果我有多个类,我应该在构造函数中传递LoggerInterface,还是有更好的实践?或者我甚至不应该把它传给这些班级 如果我想让一个类在没有LoggerInterface的情况下工作,我是否总是检查$this->logger是否为null,然后采取相应的行动 比如说, class ObjectOne { /** * @var LoggerInterf

在阅读文档和示例时,我发现
LoggerInterface
通过依赖项As的构造函数传递,这允许依赖项输出到控制台

我的问题是:

  • 如果我有多个类,我应该在构造函数中传递
    LoggerInterface
    ,还是有更好的实践?或者我甚至不应该把它传给这些班级

  • 如果我想让一个类在没有
    LoggerInterface
    的情况下工作,我是否总是检查
    $this->logger
    是否为null,然后采取相应的行动

  • 比如说,

    class ObjectOne {
        /**
         * @var LoggerInterface
         */
        private $logger;
    
        public function __construct (LoggerInterface $logger) {
            $this->logger = $logger;
        }
    }
    
    class ObjectTwo {
        /**
         * @var ObjectOne[]
         */
        private $items;
    
        /**
         * @var LoggerInterface
         */
        private $logger;
    
        public function __construct (LoggerInterface $logger) {
            $this->logger = $logger;
        }
    
        public function addObject () {
            $this->items[] = new ObjectOne($this->logger);
        }
    }
    

    在这种情况下,
    LoggerInterface
    的使用只不过是一种类型提示

    如果传递未实现此接口的类(或任何其他对象)的实例,例如:

    $objectOne = new ObjectOne('randomstring');
    
    将抛出一个错误,说明
    ObjectOne
    的第一个参数必须是
    LoggerInterface
    的实例,字符串已给定

    您可以完全删除此类型提示,但随后可以使用任何类型的第一个参数实例化您的类。
    因此,删除此检查可能会产生意外错误,例如,如果第一个参数不是实现
    LoggerInterface
    的类的实例,并且您尝试调用该参数是其实例的类未实现的方法

    此外,接口允许强制类实现与接口实现的方法相同的方法,这是类之间的一种契约。
    因此,您可以有几个不同的类实现同一个接口,并尊重类构造函数第一个参数的类型提示