Php SimpleXML奇怪的类型转换行为

Php SimpleXML奇怪的类型转换行为,php,simplexml,casting,Php,Simplexml,Casting,今天,我们的一位客户投诉说,在他的店里,有些价格稍低(1,-Kč)。当我开始调试时,我认为这可能是一个舍入错误。我们正在使用SimpleXML导入产品的价格,从代码的外观来看,一切似乎都是正确的,但当我进行dome var_转储时,有些价格真的很糟糕。有一个ceil函数将天花板54.6200保持在54之间。我知道我必须在使用SimpleXML值之前对它们进行类型转换,但这种行为对我来说似乎很奇怪。似乎当我接收存储在SimpleXMLElement的字符串节点中的浮点值时,该值在ceil函数之前被

今天,我们的一位客户投诉说,在他的店里,有些价格稍低(1,-Kč)。当我开始调试时,我认为这可能是一个舍入错误。我们正在使用SimpleXML导入产品的价格,从代码的外观来看,一切似乎都是正确的,但当我进行dome var_转储时,有些价格真的很糟糕。有一个ceil函数将天花板
54.6200
保持在
54
之间。我知道我必须在使用SimpleXML值之前对它们进行类型转换,但这种行为对我来说似乎很奇怪。似乎当我接收存储在SimpleXMLElement的字符串节点中的浮点值时,该值在ceil函数之前被类型化为int

好吧,这是我可以接受的,这个脚本是由一个人编写的,他可能不知道他需要从SimpleXML中键入所有内容,但这对我来说仍然有点奇怪。有人知道这是怎么回事吗?PHP的ceil函数acceps float作为参数,所以我希望该值被类型化为float,但在本例中,它是int(您可能需要运行代码)


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

这个操作符的实现看到一个对象,必须决定如何处理它。内部对象提供了一个挂钩,可以将它们转换为任何类型()。但是,此处理程序只接收一个目标类型。引擎必须在执行此操作之前决定将对象转换为哪种类型,不幸的是,它选择了整数类型


您唯一的选择是添加显式强制转换,就像您所做的那样。

好的,这似乎是合理的。我认为它与内部对象有关,因为:
$item=newstdclass$项目->PHE='54.6200';echo ceil($item->PHE)按预期工作。但是,我不应该将此作为错误报告归档吗?这种行为在我看来是完全错误的(也是无法预料的),你是对的。我尝试了
var_dump($item->PHE+1)
,结果是
int(55)
@cypher这是以前报道过的:它不仅有意义,而且是真的:)如果对这种行为有什么要说的,那就是在使用它进行计算之前,最好总是将对象强制转换为适当的类型。是的,这是同样的问题。另一方面,
cast\u object
不是用于铸造对象吗?因为我不是在强制转换对象,我是在强制转换该对象的字符串属性。。。
<?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>';
object(SimpleXMLElement)#1 (1) refcount(2){
  ["PHE"]=>
  string(7) "54.6200" refcount(1)
}
$obj = new InternalClass();
var_dump(5 + $obj);