0

我刚刚从 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 中设置任何变量以使其以不同的方式工作吗?我是否只需要学习处理它并查看我所有可能在某些代码中使用 Objects as Integers 的代码?

4

3 回答 3

0

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

if((string)$e == something)

无论哪种方式,您都必须更改代码... *在 php 5.4.27 上测试

于 2014-09-29T17:52:06.323 回答
0

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

您编写的一些代码依赖于在 PHP 中滥用一些定义不明确的类型和转换恶作剧,我们都曾在某个时候做到过。PHP 开发人员已修复该问题并破坏了您的代码。解决方案是修复您的代码并学习有关滥用 PHP 松散类型系统的教训。

解决方法是检查我们的代码并将代码行更改为

if("$e" == 50)

或者

if($e->getId() == 50)
于 2014-09-30T18:49:09.643 回答
0

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

于 2017-03-05T18:43:18.203 回答