我创建了一个Template类来管理视图及其相关数据。它实现IteratorArrayAccess,并允许“子模板”易于使用,例如:

<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类型的对象,1int类型的对象,所以您收到一个错误。在这种情况下,((string) $template['foo'])不是“重铸”,而是第一次铸造。

09-30 00:36