php - SimpleXML 奇怪的类型转换行为

标签 php simplexml casting

今天,我们的一位客户投诉说,他店里的一些价格略低(准确地说是 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/

相关文章:

php - API 测试工具

php - preg_replace 即使在第一次替换之后也匹配字符串中的所有匹配项

php - SimpleXMLElement 对象,键中带有 @ 和破折号

PHP SimpleXML 到 JSON 编码单元素数组

php - 如何创建 sitemap.xml 来告诉 Googlebot 抓取更新的内容?

javascript - PHP call_user_func 像 Javascript 调用一样绑定(bind) thisArg

php - 循环访问 SimpleXML 对象,或将整个对象转换为数组

java - 在通用类中转换

Java - 转换为 E[]

c# - Visual Studio 设计器加载失败