Семантика добавления объекта и целого числа друг к другу в 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://www.youtube.com/watch?v=kXEgk1Hdze0

3 ответа

Решение

Дополнение (+) неявно приводит оба операнда к 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 = правда

Другие вопросы по тегам