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 = 1001
或1 + 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的语义