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

时间:2016-04-15 16:10:09

标签: php symfony symfony-console

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

我的问题是:

  1. 如果我有多个班级,我会继续在构造函数中传递LoggerInterface,还是有更好的练习?或者我是否应该将它传递给这些课程?

  2. 如果我想让课程在LoggerInterface之外完成,我是否总是只检查$this->logger是否为空,然后采取相应行动?

  3. 例如,

    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);
        }
    }
    

1 个答案:

答案 0 :(得分:0)

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

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

$objectOne = new ObjectOne('randomstring');

将抛出一个错误,指出ObjectOne的第一个参数必须是LoggerInterface的实例,给定字符串。

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

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