У меня есть вопрос, который я долго трудился.Я создаю шаблонизатор с двумя основными классами Template.php
и Tag.php
, с кучей классов расширения, таких как Img.php
и String.php
.
Программа работает так:
Объект Template создает объекты Tag.Каждый объект тега определяет, какой класс расширения (img, string и т. Д.) Реализовать.
Смысл класса тега заключается в предоставлении вспомогательных функций для каждого класса расширения, таких как wrap('div'),
addClass('slideshow')
и т. Д.
Каждый класс Img или String используется для визуализации кода, соответствующего тому, что требуется, поэтому $Img->render()
даст что-то вроде <img src='blah.jpg' />
Мой вопрос:
Должен ли я инкапсулировать все функциональные возможности расширения в объекте Tag следующим образом:
Tag.php
function __construct($namespace, $args) {
// Sort out namespace to determine which extension to call
$this->extension = new $namespace($this); // Pass in Tag object so it can be used within extension
return $this; // Tag object
}
function render() {
return $this->extension->render();
}
Img.php
function __construct(Tag $T) {
$args = $T->getArgs();
$T->addClass('img');
}
function render() {
return '<img src="blah.jpg" />';
}
Использование:
$T = new Tag("img", array(...);
$T->render();
.... или я должен создать больше структуры наследования , потому что «Img is a Tag»
Tag.php
public static create($namespace, $args) {
// Sort out namespace to determine which extension to call
return new $namespace($args);
}
Img.php
class Img extends Tag {
function __construct($args) {
// Determine namespace then call create tag
$T = parent::__construct($namespace, $args);
}
function render() {
return '<img src="blah.jpg" />';
}
}
Использование:
$Img = Tag::create('img', array(...));
$Img->render();
Одна вещь, которая мне нужна, это общий интерфейс для создания пользовательских тегов,то есть я могу создать экземпляр Img (...), а затем создать экземпляр String (...), янужно создавать экземпляры каждого расширения с помощью Tag.
EDIT: Также просто для пояснения: у класса Tag есть функциональные возможности, общие для всех классов расширений, в классе Tag не должно быть никаких методовэто должно быть реализовано в классах расширения.Класс тегов просто предоставляет вспомогательные функции.
Я знаю, что это несколько неопределенный вопрос, я надеюсь, что некоторые из вас имели дело с этим в прошлом и могут предвидеть определенные проблемы при выборе каждого шаблона проектирования.Если у вас есть другие предложения, я бы с удовольствием их выслушал.
Спасибо!Мэтт Мюллер