Задать вопрос
geometria
@geometria

Почему не выполняются методы заявленные в интерфейсе?

Пытаюсь на простейшем базовом примере реализовать Factory Method, но методы log() в классах FileLogger и StdoutLogger просто пропускаются.

index.php

spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});

function clientCode(LoggerFactory $creator)
{
   $creator->createLogger("hello");
}

clientCode(new FileLoggerFactory("uml\uml.txt"));
clientCode(new StdoutLoggerFactory("uml\uml.txt2"));


Logger.php

interface Logger
{
    public function log(string $message);
}


LoggerFactory.php

interface LoggerFactory
{
    public function createLogger(): Logger;
}


FileLoggerFactory.php

class FileLoggerFactory implements LoggerFactory
{
    private $filePath;

    public function __construct(string $filePath)
    {
      $this->filePath = $filePath;
    }

    public function createLogger(): Logger
    {
      return new FileLogger($this->filePath);
    }
}


StdoutLoggerFactory.php

class StdoutLoggerFactory implements LoggerFactory
{

    public function __construct()
    {

    }
    public function createLogger(): Logger
    {
        return new StdoutLogger();
    }
}


FileLogger.php

class FileLogger implements Logger
{
    private $filePath;

    public function __construct(string $filePath)
    {
      $this->filePath = $filePath;
    }

    // этот метод не работает
    public function log(string $message)
    {
        echo "message: $message </br>";
    }
}


StdoutLogger.php

class StdoutLogger implements Logger
{
    public function __construct()
    {

    }

   // этот метод не работает
    public function log(string $message)
    {
        echo "message: $message";
    }
}


Почему не исполняются методы log()?
Как заставить их запускаться?
  • Вопрос задан
  • 209 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 1
MaKvc
@MaKvc
Отчаянный веб-разработчик
У вас два класса в которых обловлена функция log. Но где ее непосредственный вызов???

FileLogger.php

class FileLogger implements Logger
{
    private $filePath;

    public function __construct(string $filePath)
    {
      $this->filePath = $filePath;

      $this->log('Хэй! Я функция log, меня вызвали сразу после создания!');
    }

    // этот метод не работает
    public function log(string $message)
    {
        echo "message: $message </br>";
    }
}


Так?

function clientCode(LoggerFactory $creator)
{
   $creator->createLogger()->log("hello");
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы