3
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

4

3 回答 3

3

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

似乎,至少现在,object强制转换int会导致 value 1,因此 result1000 + 1 = 1001或者1 + 1000 = 1001,但是,根据文档,行为是未定义的,不应依赖。

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

于 2013-05-02T12:01:43.487 回答
1

你是对的,你不应该将 Object 转换为 Integer 并且你不能!这就是 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)
于 2013-05-02T11:59:18.973 回答
0

确保我得到实际执行演员的代码:

来自 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 = 的语义真的

于 2013-05-02T12:00:34.217 回答