PHP对象无法转换为int

问题描述 投票:0回答:3

我刚刚从PHP 5.3升级到PHP 5.5并且我面临一个警告,我在使用__toString()方法将Object转换为int时没有得到。

示例代码是

<?php

class MyObject {
    protected $_id;
    public function setId($id) { $this->_id = $id; }
    public function __toString() { return (string)$this->_id; }
}

$e = new MyObject();
$e->setId("50");
if($e == "50") echo "50 == 50 as String\n";
else echo "50 !== 50 as String\n";

$e->setId(50);
if($e == 50) echo "50 == 50 as Integer\n";
else echo "50 !== 50 as Integer\n";

$e->setId("50");
if($e == 50) echo "50 == 50 as String = Integer\n";
else echo "50 !== 50 as String = Integer\n";

$e->setId(50);
if($e == "50") echo "50 == 50 as Integer = String\n";
else echo "50 !== 50 as Integer = String\n";

我服务器的输出是

50 == 50 as String
50 !== 50 as Integer
50 !== 50 as String = Integer
50 == 50 as Integer = String

虽然我期待所有这些都是真的。我在运行时收到的通知是:

Object of class MyObject could not be converted to int

它们由包含代码的行触发

($e == 50)

这是为了这个吗?我可以在PHP ini中设置任何变量,使其工作方式不同吗?我是否只需要学会处理它并查看我在一些代码中可能使用对象作为整数的所有代码?

php php-5.5 object-to-string
3个回答
0
投票

更好地做到这一点的一种方法是@ bali182通过定义另一种方法的解决方案,或者你可以在比较时将对象转换为字符串:

if((string)$e == something)

无论哪种方式,你将不得不改变你的代码... *测试PHP 5.4.27


0
投票

我将引用Sammitch的评论来回答我的问题

你编写了一些依赖于在PHP中滥用一些不明确的输入和转换恶作剧的代码,我们都在某些时候完成了它。 PHP开发人员修复了这个并破坏了你的代码。解决方案是修复代码并学习有关滥用PHP松散类型系统的课程。

修复是审查我们的代码并将代码行更改为

if("$e" == 50)

要么

if($e->getId() == 50)

0
投票

在PHP中没有像我们在更好的语言中那样的valueOf,并且解释器不足以尝试转换为字符串,然后转换为其他基元。也许旧版本支持您声称的功能,我不知道。你能做的是(int) (string) $myObject$myObject->toInt()。相比之下,它足以转换为字符串,如果我们谈论松散的平等,PHP将完成剩下的工作。

© www.soinside.com 2019 - 2024. All rights reserved.