我刚刚从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中设置任何变量,使其工作方式不同吗? 我是否只需要学会处理它并查看我的所有可能在某些代码中使用对象作为整数的代码?
答案 0 :(得分:0)
通过定义另一种方法可以更好地做到这一点的方法是@ bali182的解决方案,或者你可以在比较时将对象转换为字符串:
if((string)$e == something)
无论哪种方式,您都必须更改代码...... *在php 5.4.27上测试
答案 1 :(得分:0)
我将引用Sammitch的评论来回答我的问题
你写了一些代码,依赖于在PHP中滥用一些不明确的输入和转换恶作剧,我们都在某些时候完成了它。 PHP开发人员修复了这个并破坏了你的代码。解决方案是修复代码并学习有关滥用PHP的松散打字系统的课程。
修复是检查我们的代码并将代码行更改为
if("$e" == 50)
或
if($e->getId() == 50)
答案 2 :(得分:0)
PHP中没有valueOf
,就像我们在更好的语言中一样,并且解释器不足以尝试转换为字符串,然后转换为其他基元。也许旧版本支持您声称的功能,我不知道。您可以做的是(int) (string) $myObject
或$myObject->toInt()
。相比之下,它足以转换为字符串,如果我们谈论松散的平等,PHP将完成剩下的工作。