2014-09-29 186 views
0

我刚刚从PHP 5.3升级到PHP 5.5,并且面临着使用__toString()方法将Object强制转换为int时未得到的警告。无法将PHP对象转换为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中设置的变量使其工作方式不同? 我是否需要学习处理它并查看可能在某些代码中将对象用作整数的所有代码?这样做的更好的

+2

来自php docs ** __toString()方法允许类决定当它像字符串一样对待时它将如何反应。例如,什么echo $ obj;将打印。此方法必须返回一个字符串,否则会发出致命的E_RECOVERABLE_ERROR级别错误。** – BojanT 2014-09-29 17:40:26

+0

什么行号导致PHP通知? – Jublo 2014-09-29 17:42:55

+3

为什么你想要做这样的事情?为什么不写一个'getId()'并将它比作'$ e-> getId()=== 50'? – 2014-09-29 17:42:59

回答

0

一种方式是@ bali182的解决方案定义的另一种方法,或者你可以投对象的字符串,而比较:

if((string)$e == something) 

无论哪种方式,你必须改变你的代码... *测试在PHP 27年5月4日

0

我要去引述Sammitch的评论

回答我的问题是你写一些代码,依靠滥用一些不明确的打字在PHP中转换shenanigans,我们都在某个时候完成了它。 PHP开发人员修复了这个问题并破坏了你的代码。解决方案是修复你的代码,并学习关于滥用PHP宽松输入系统的教训。

的修复是审查我们的代码,并更改代码行要么

if("$e" == 50) 

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

PHP中没有valueOf像我们有更好的语言和解释不足以尝试转换为字符串,然后转换为其他基元。也许旧版本支持该功能,因为你声称,我不知道。你可以做的是(int) (string) $myObject$myObject->toInt()。通过比较,它足以隐藏字符串,如果我们正在讨论松散的平等,PHP将完成其余的工作。