我创建了一个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
对象中。我使用了magic
__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
有点挫败了要跳出那个圈套的目的。对于这种行为是否存在任何解决方案,或者我应该只是这样,偶然地防止视图中的数据修改?
最佳答案
echo正在尝试回显$template['foo'] + 1
的结果。因为$template['foo']
是TemplateData
类型的对象,1
是int
类型的对象,所以您收到一个错误。在这种情况下,((string) $template['foo'])
不是“重铸”,而是第一次铸造。