Я создал класс Template
для управления представлениями и связанными с ними данными.Он реализует Iterator
и ArrayAccess
и разрешает использование «под-шаблонов» для простого использования, например:
<p><?php echo $template['foo']; ?></p>
<?php foreach($template->post as $post): ?>
<p><?php echo $post['bar']; ?></p>
<?php endforeach; ?>
В любом случае, вместо использования встроенных основных функций, таких как hash()
или date()
Я подумал, что было бы полезно создать класс с именем TemplateData
, который будет выполнять функцию оболочки для любых данных, хранящихся в шаблонах.
Таким образом, я могу добавить списокиз распространенных методов форматирования, например:
echo $template['foo']->asCase('upper');
echo $template['bar']->asDate('H:i:s');
//etc..
Когда значение задается через $template['foo'] = 'bar';
в контроллерах, значение 'bar'
сохраняется в его собственном TemplateData
объекте.
Я использовал магию __toString()
, поэтому, когда вы отображаете объект TemplateData
, он преобразуется в (string)
и сбрасывает его значение.Однако, несмотря на то, что контроллеры и представления mantra не должны изменять данные , всякий раз, когда я делаю что-то вроде этого:
$template['foo'] = 1;
echo $template['foo'] + 1; //exception
Он умирает на Object of class TemplateData could not be converted to int
;Если только я не передам $template['foo']
в строку:
echo ((string) $template['foo']) + 1; //outputs 2
В некотором смысле побеждает цель перепрыгнуть через этот обруч. Существуют ли какие-либо обходные пути для такого рода поведения, или я должен просто принять это как есть, случайное предотвращение изменения данных в представлениях?