Почему в PHP нет ошибки, если вы пытаетесь использовать скобки, чтобы получить значение ключа в NULL? - PullRequest
2 голосов
/ 14 апреля 2011

Я попробовал следующий код в phpsh и стандартной ненормальной php -a для мерзости:

$a = NULL;
echo $a['foobar'];

К моему сожалению (я бы не назвал это удивлением или разочарованием в том, что касается PHP), я не получаю никаких ошибок, предупреждений, исключений или чего-либо еще.

Более умные языки, такие как Ruby и Python, жалуются при попытке разыменования ключа, например, None или nil. Как PHP интерпретирует эту ситуацию? Является ли единственное лекарство, вставляющее проверки is_null везде? Должен ли я винить Смарти в том, что он не сделал этого для меня?

1 Ответ

2 голосов
/ 14 апреля 2011

Согласно исходному коду 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']);    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...