3

我创建了一个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

有点违背了必须跳过那个箍的目的。是否存在针对此类行为的任何解决方法,或者我应该照原样采取这种做法,偶然防止视图中的数据修改?

4

3 回答 3

1

Echo 试图回显$template['foo'] + 1. 由于$template['foo']is 类型的对象TemplateData并且1int,因此您收到错误消息。在这种情况下,((string) $template['foo'])不是“重铸”,它的铸件是第一次。

于 2011-03-03T22:47:27.767 回答
1

PHP 不支持运算符加载。如果您希望能够执行加法(或任何其他与操作符相关的操作),您将需要为您想要支持的每个操作符提供一个方法。很可能在基本模板类上实现它对于常见情况就足够了,如果需要的话,可以在以后对其进行扩展。虽然(string)在您的对象上使用是一种快捷方式,但我建议您不要这样做。

于 2011-03-03T23:21:37.367 回答
0

我稍微改变了我的实现,它似乎暂时有效;我已将__invoke()方法添加到TemplateData类中,该方法返回$_data属性,无需进行类型转换。所以在实践中:

//in controller
$template['foo'] = 'bar';
$template['abc'] = 123;

//in view
echo $template['foo']();                       //bar
echo $template['foo']->asHash('md5');          //37b51d194a7513...
echo $template['abc']();                       //123
echo $template['abc']() + 123;                 //246
echo $template['abc']->asHash('md5');          //202cb962ac5907...

//__invoke also takes $function and $arguments for alternative syntax
echo $template['foo']('asHash', array('md5')); //37b51d194a7513...

我想自从我征服了这座山之后,我的下一步就是以某种方式允许链接:

echo $template['foo']->asHash('md5')->asCase('upper');

然而,这似乎很难做到。跟踪“链状态”是我之前尝试过的,但没有成功。__invoke()从某种意义上说,这将相当容易(但很混乱) :

echo $template['foo'](
    array('asHash', 'asCase'),          //ordered array of method names
    array(array('md5'), array('upper')) //ordered array of method argument arrays
);

任何人都可以看到其中的任何问题,或替代方法的其他推理吗?

于 2011-03-04T18:34:51.130 回答