SimpleXML奇怪的类型转换行为

时间:2011-06-29 09:27:29

标签: php simplexml casting

今天我们的一位客户发出投诉,在他的商店里,有些价格略低(1, - Kč)。当我开始调试时,我认为这可能是一个舍入错误。我们使用SimpleXML来导入产品的价格,从代码的外观来看,一切看起来都是正确的,但是当我做了圆顶var_dumps时,一些价格非常糟糕。有一个ceil函数,它保持54.620054的上限。我知道在使用之前我必须对所有SimpleXML值进行类型转换,但这种行为对我来说似乎很奇怪。似乎当我将存储在SimpleXMLElement的字符串节点中的浮点值减去时,该值在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)
}

1 个答案:

答案 0 :(得分:2)

PHP通常更喜欢在数学运算的上下文中将对象转换为整数。假设你这样做:

$obj = new InternalClass();
var_dump(5 + $obj);

此运算符的实现会看到一个对象,并且必须决定如何处理它。内部对象提供了一个钩子,允许它们转换为任何类型(cast_object)。但是,此处理程序只接收一个目标类型。在这样做之前,引擎必须决定转换对象的类型,不幸的是,它会选择整数类型。

你唯一的选择就是像你一样添加一个显式的强制转换。