__toString magic and type coercion
- by TomcatExodus
I've created a Template class for managing views and their associated data. It implements Iterator and ArrayAccess, and permits "sub-templates" for easy usage like so:
<p><?php echo $template['foo']; ?></p>
<?php foreach($template->post as $post): ?>
<p><?php echo $post['bar']; ?></p>
<?php endforeach; ?>
Anyways, rather than using inline core functions, such as hash() or date(), I figured it would be useful to create a class called TemplateData, which would act as a wrapper for any data stored in the templates.
This way, I can add a list of common methods for formatting, for example:
echo $template['foo']->asCase('upper');
echo $template['bar']->asDate('H:i:s');
//etc..
When a value is set via $template['foo'] = 'bar'; in the controllers, the value of 'bar' is stored in it's own TemplateData object.
I've used the magic __toString() so when you echo a TemplateData object, it casts to (string) and dumps it's value. However, despite the mantra controllers and views should not modify data, whenever I do something like this:
$template['foo'] = 1;
echo $template['foo'] + 1; //exception
It dies on a Object of class TemplateData could not be converted to int; Unless I recast $template['foo'] to a string:
echo ((string) $template['foo']) + 1; //outputs 2
Sort of defeats the purpose having to jump through that hoop. Are there any workarounds for this sort of behavior that exist, or should I just take this as it is, an incidental prevention of data modification in views?