我创建了一个模板
类来管理视图及其相关数据。它实现了迭代器
和数组访问
,并允许使用“子模板”轻松使用,如下所示:
<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)
并且输出其数值。但是,尽管有“控制器和视图不应该修改数据”的口号,每当我像这样做时:$template['foo'] = 1;
echo $template['foo'] + 1; //exception
出现错误信息:无法将类TemplateData的对象转换为int
; 除非我将$template ['foo']
重新定义为字符串(recast):
echo ((string) $template['foo']) + 1; //outputs 2
需要跳过这个环节有点失去了目的。
是否存在任何解决这种行为的方法,或者我应该将其视为一种偶然性,防止在视图中修改数据?
(string)
来强制转换为字符串再相加。但是,对于echo
语句,你在尝试执行加法时还没有调用__toString()
,因为echo
会尝试将整个表达式的结果输出。 - thetaikoasInt()
方法会更好。 - thetaikoMethod TemplateData::__toString() must return a string value
- 否则,我可能会在实例化时使用gettype()
或一系列的is_*()
进行存储类型作为属性,然后在输出时相应地进行转换。当然,这样做是不起作用的。 - Dan LuggTemplate
类中添加另一个方法。你可以重写 getOffset 方法来强制转换为整数,但我怀疑你不希望在每种情况下都这样做。 - thetaiko__cast()
魔法等等。 - Dan Lugg