gpt4 book ai didi

php - __toString 魔术和类型强制

转载 作者:搜寻专家 更新时间:2023-10-31 21:17:38 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com