今天,我们的一位客户投诉说,他店里的一些价格略低(准确地说是 1,- Kč)。当我开始调试时,我认为这可能是一个舍入错误。我们正在使用 SimpleXML 来导入产品的价格,从代码的外观来看,一切似乎都是正确的,但是当我做 dome var_dumps 时,有些价格真的很糟糕。有一个 ceil 函数可以将上限 54.6200
保持在 54
。我知道我必须在使用它们之前对所有 SimpleXML 值进行类型转换,但这种行为对我来说似乎很奇怪。似乎当我 ceil 存储在 SimpleXMLElement 的字符串节点中的浮点 vlaue 时,该值在 ceil 函数之前被类型转换为 int。
好吧,这是我可以接受的,脚本是由一个人编写的,他可能不知道他需要从 SimpleXML 中转换所有内容,但这对我来说仍然有点奇怪。有人知道这是怎么回事吗?PHP 的 ceil 函数接受 float 作为参数,所以我希望值被转换为 float,但在本例中,它是 int。 (您可能想要运行代码)
<?php
$item = simplexml_load_string(
<<<ITEM
<Item>
<PHE>54.6200</PHE>
</Item>
ITEM
);
echo '<pre>';
echo $item->PHE.PHP_EOL; //54.6200
echo ceil($item->PHE).PHP_EOL; //54!!!
echo ceil((string)$item->PHE).PHP_EOL; //55
echo ceil((float)$item->PHE).PHP_EOL; //55
echo ceil('54.6200'); //55
echo PHP_EOL.PHP_EOL;
debug_zval_dump($item);
echo '</pre>';
zval_dump 的输出:
object(SimpleXMLElement)#1 (1) refcount(2){
["PHE"]=>
string(7) "54.6200" refcount(1)
}
最佳答案
PHP 通常更喜欢在数学运算的上下文中将对象转换为整数。假设您这样做:
$obj = new InternalClass();
var_dump(5 + $obj);
此运算符的实现看到一个对象,必须决定如何处理它。内部对象提供了一个钩子(Hook),允许将它们转换为任何类型 ( cast_object
)。但是,此处理程序仅接收一种目标类型。引擎必须在这样做之前决定将对象转换为哪种类型,不幸的是,它选择了整数类型。
您唯一的选择是像您一样添加显式转换。
关于php - SimpleXML 奇怪的类型转换行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518421/