我创建了一个Template用于管理视图及其相关数据的类。它实现Iteratorand ArrayAccess,并允许“子模板”以便于使用,如下所示:
<p><?php echo $template['foo']; ?></p>
<?php foreach($template->post as $post): ?>
<p><?php echo $post['bar']; ?></p>
<?php endforeach; ?>
无论如何,与其使用内联核心函数,例如hash()or date(),我认为创建一个名为 的类会很有用TemplateData,它将充当存储在模板中的任何数据的包装器。
这样,我可以添加常用的格式化方法列表,例如:
echo $template['foo']->asCase('upper');
echo $template['bar']->asDate('H:i:s');
//etc..
当通过$template['foo'] = 'bar';控制器设置一个值时,该值'bar'存储在它自己的TemplateData对象中。
我使用了魔法__toString(),所以当你回显一个TemplateData对象时,它会转换(string)并转储它的值。然而,尽管口头禅控制器和视图不应该修改数据,每当我做这样的事情:
$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
有点违背了必须跳过那个箍的目的。是否存在针对此类行为的任何解决方法,或者我应该照原样采取这种做法,偶然防止视图中的数据修改?