Статический контекст для некоторых часто необходимых данных? Лучшая практика?

#php #oop #static #coding-style

#php #ооп #статический #стиль кодирования

Вопрос:

Я написал несколько веб-фреймворков на PHP. Мне посоветовали ничего не делать в статическом контексте. Но у меня есть несколько вопросов по этому поводу.

Представьте себе следующий класс:

 class Image extends HtmlControl {
    public $src;
    public $alt;
    function getDetailPath()
    {
        return 'Common/Image';
    }
}
  

В этом нет ничего особенного. Это класс для рендеринга изображения в Html. Мой базовый класс имеет следующую текущую реализацию:

 abstract class HtmlControl {
    private $template;

    abstract function getDetailPath();

    public function __construct(ViewInformation $viewInformation) {
        $this->template = 'foo/bar/' . $viewInformation->getEndpoint() . '/' . $this->getDetailPath() . '.php';
    }

    public function render() {
        $output = '';
        //Load template end fill $output
        return $output;
    }
}
  

Также ничего особенного. В основном он преобразует тип конечной точки (что-то вроде интерфейса или серверной части) в соответствующий файл шаблона и предоставляет метод render для получения выходных данных.

Проблема в том, что мне нужно каждый раз для каждой части html-элемента управления указывать $viewInformation параметр.

 $img = new Image($this->_info);
  

На мой взгляд, что-то подобное было бы намного приятнее:

 $img = new Image();
  

Поэтому мне пришлось бы сохранить состояние, какая конечная точка должна использоваться, в статическом контексте. Что-то вроде этого (обратите внимание на Request::getEndpoint() часть):

 abstract class HtmlControl {
    private $template;
    abstract function getDetailPath();

    public function render() {
        $template =  'foo/bar/' . Request::getEndpoint() . '/' . $this->getDetailPath() . '.php';
        $output = '';
        //Load template end fill $output
        return $output;
    }
}
  

Мой вопрос: нормально ли в этом случае иметь конечную точку в статическом контексте? Если нет, может ли моя текущая реализация улучшиться?

Комментарии:

1. Почему бы не передать контекст, когда вы это делаете ->render() ? Кроме того, я думаю, что если вы вдаетесь в такие подробности, возможно, вы бы предпочли использовать DOMDocument 🙂

2. Плохая сторона статического материала — это, по сути, скрытые зависимости; вторичными по отношению к этому являются проблемы, связанные с тестированием.

3. Спасибо @Jack , это хороший момент. Я изменю это. Вы дали мне небольшой, но отличный ответ. Это действительно помогает мне. Поскольку я загружаю «$ img» в «$container», мой $container может справиться с этим. Разве лес не из-за деревьев 🙂