Согласно исходному коду PHP (Zend/zend_execute.c
), только строки, массивы и объекты могут вызывать ошибки при доступе к смещению / индексу. Остальное более или менее игнорируется:
$a = true;
$b = false;
$c = null;
$d = 1;
$e = 1.234;
$f = '';
$g = array();
$h = new stdClass;
echo $a[0]; // NULL
echo $b[0]; // NULL
echo $c[0]; // NULL
echo $d[0]; // NULL
echo $e[0]; // NULL
echo $f[0]; // E_NOTICE: Uninitialized string offset
echo $g[0]; // E_NOTICE: Undefined offset
echo $h[0]; // E_FATAL: Cannot use object as array
Ни один из $a
, $b
, $c
, $d
или $e
фактически не выплевывает ошибку. В большинстве случаев в коде я просто вижу return;
или return 0;
, что означает NULL вместо возвращенного вызова zval*
(указатель) или zend_error()
. Отсюда и результаты выше.
Какой бы ни была причина, по которой это было сделано, это не имеет значения. В таких случаях вы всегда должны проверять наличие и / или недействительность переменной. Самые безопасные способы (немного отличающиеся поведения) - isset
и empty
:
isset($a['foo']);
!empty($a['foo']);