PHP中一个对象和一个整数相互相加的语义


Semantics of adding an Object and an integer to each other, in PHP?

class wat
{
   public $a = 3.14;
   public $x = 9;
   public $y = 2;
}

$a = new wat();
var_dump(1000 + $a);
var_dump($a + 1000);

输出为:

int(1001)
int(1001)

好吧,添加wat*对象到一个整数显然是不正确的事情,因为PHP抱怨它与"类wat的对象不能转换为int",但是,它做什么呢?

(我问这个问题也有一个实际的原因,我想重构一个函数来摆脱"PHP通知",同时仍然保持行为完全不变。)


*: http://img.youtube.com/vi/kXEgk1Hdze0/1.jpg

如果其中一个是float,则加法(+)隐式地将两个操作数转换为float,否则两个操作数都转换为int(参见第2段)

看起来,至少现在,将object转换为int会产生值1,因此结果为1000 + 1 = 10011 + 1000 = 1001,然而,根据文档,该行为未定义,不应依赖。

如果您打开了E_NOTICE错误报告,还应该产生一个通知,指出对象无法转换为int。

你是对的,你不应该把一个对象转换成一个整数,你不能!这就是为什么PHP将整数1赋值给变量并给出如下提示:

Notice: Object of class foo could not be converted to int in /path/to/file.php on line 1
$foo is now 1
int(1)

确保我得到了实际执行强制转换的代码:

从Zend/zend_operators.c:

case IS_OBJECT:
    {
    int retval = 1;
        /* some other code */
        ZVAL_LONG(op, retval);  // < This sets the 1 you see.
        return;
    }

所以不像我之前说的内部强制类型转换((int)(boolean)$object)通过这样做,它们保留了0,",NULL,false = false和!0,"…",Object = true的语义