php - __toString 魔术和类型强制

标签 php type-conversion tostring magic-methods

我创建了一个 Template 类来管理 View 及其相关数据。它实现了 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..

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

关于php - __toString 魔术和类型强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5187378/

相关文章:

java - 将扫描仪字符转换为字节

c - 有没有办法使用 C 标准库来转换 string----->int 并跟踪解析的字符数?

groovy - 在 Groovy 中将整数转换为十六进制字符串

java - Kotlin - 为非数据类生成 toString()

c++ - 在类中使用未声明的标识符作为私有(private)变量 (C++)

javascript - 如何获取 javascript 日期函数和数据库日期之间的耗时?

php - 尝试使用 php 变量排队 css 文件时发生 fatal error get_option()

C (XC8) 使用三元运算符隐式有符号到无符号转换

php - 使用 PHP 在 MySQL 数据库中自动加密?

php - 可数对象和不可数对象有什么区别