我创建了一个 Template
类来管理 View 及其相关数据。它实现了 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..
当通过 Controller 中的 $template['foo'] = 'bar';
设置值时,'bar'
的值存储在它自己的TemplateData
对象。
我使用了神奇的 __toString()
所以当你回显一个 TemplateData
对象时,它转换为 (string)
并转储它是值(value)。然而,尽管 Controller 和 View 不应该修改数据,但每当我做这样的事情时:
$template['foo'] = 1;
echo $template['foo'] + 1; //exception
它死于 TemplateData 类的对象无法转换为 int
;除非我重铸 $template['foo']
为字符串:
echo ((string) $template['foo']) + 1; //outputs 2
有点违背了必须跳过那个箍的目的。 是否存在针对此类行为的任何解决方法,或者我应该照原样处理,以防止 View 中的数据修改?
最佳答案
Echo 正在尝试回显 $template['foo'] + 1
的结果。由于 $template['foo']
是 TemplateData
类型的对象,而 1
是 int
,您收到错误。在这种情况下,((string) $template['foo'])
不是“重铸”,而是第一次转换。
关于php - __toString 魔术和类型强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5187378/