Семантика добавления объекта и целого числа друг к другу в 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 = правда