加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – SimpleXML怪异的类型转换行为

发布时间:2020-12-13 16:12:24 所属栏目:PHP教程 来源:网络整理
导读:今天我们的一位客户发出投诉,在他的商店里,有些价格略低(1,– K?).当我开始调试时,我认为这可能是一个舍入错误.我们使用Simple XML来导入产品的价格,从代码的外观来看,一切看起来都是正确的,但是当我做了圆顶var_dumps时,一些价格非常糟糕.有一个ceil函数保
今天我们的一位客户发出投诉,在他的商店里,有些价格略低(1,– K?).当我开始调试时,我认为这可能是一个舍入错误.我们使用Simple XML来导入产品的价格,从代码的外观来看,一切看起来都是正确的,但是当我做了圆顶var_dumps时,一些价格非常糟糕.有一个ceil函数保持上限54.6200到54.我知道我必须在使用之前对所有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)
}

解决方法

PHP通常更喜欢在数学运算的上下文中将对象转换为整数.让我们说你这样做:

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

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

您唯一的选择是添加显式强制转换,就像您一样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读