Как сделать ошибку PHP при использовании нецелого ключа для доступа к массиву строки - PullRequest
0 голосов
/ 19 сентября 2011

В PHP вы можете получить доступ к символам в строке с синтаксисом массива:

$foo = 'abc';
echo $foo[2]; // echos 'c'

Недавно я слишком долго отлаживал, почему $foo['id'] не дал мне ожидаемого результата. Оказалось, что $foo была строкой, а не ассоциативным массивом. Похоже, что PHP приводил 'id' к целому числу 0 без уведомления:

$foo = 'abc';
echo $foo['id']; // echos 'a', without notice

PHP выдает хорошее предупреждение, когда вы делаете это с реальными массивами:

$foo = array('a', 'b', 'c');
$echo $foo['id']; // Notice:  Undefined index: id in php shell code on line 1

Как я могу заставить (или почему не могу) PHP бросить уведомление "Неопределенный индекс" вместо приведения строкового индекса к 0?

Ответы [ 4 ]

3 голосов
/ 19 сентября 2011

К сожалению, вы ничего не можете сделать, кроме исправления PHP.

Однако, если вы действительно хотите исправить PHP, это возможное исправление (против транка):

Index: Zend/zend_execute.c
===================================================================
--- Zend/zend_execute.c (revision 316974)
+++ Zend/zend_execute.c (working copy)
@@ -1268,7 +1268,7 @@
                                                case IS_DOUBLE:
                                                case IS_NULL:
                                                case IS_BOOL:
-                                                       /* do nothing */
+                                                       zend_error(E_NOTICE, "String offset is not an integer");
                                                        break;
                                                default:
                                                        zend_error(E_WARNING, "Illegal offset type");

Тогда:

$ ~/php/php-t/bin/php -d error_reporting=-1 -r '$a="foo"; echo $a["bar"];'

Notice: String offset is not an integer in Command line code on line 1
f
0 голосов
/ 10 декабря 2012

PHP 5.4 теперь показывает ошибку!

$foo = 'abc';
echo $foo['id'];
PHP Warning:  Illegal string offset 'id' in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
0 голосов
/ 19 сентября 2011

Это "особенность" :

Запись в смещение вне диапазона дополняет строку пробелами. Нецелочисленные типы преобразуются в целое число. Выдает недопустимый тип смещения E_NOTICE. Отрицательное смещение выдает E_NOTICE при записи, но читает пустым строка. Используется только первый символ назначенной строки. Присвоение пустой строки присваивает NULL байт.

И Строка 'id' преобразуется в целое число ноль :

Значение задается начальной частью строки. Если строка начинается с допустимых числовых данных, это будет используемое значение. В противном случае значение будет 0 (ноль). Допустимые числовые данные необязательный знак, сопровождаемый одной или несколькими цифрами (необязательно содержащий десятичная точка), за которой следует необязательный показатель степени. Экспонента является 'e' или 'E', за которыми следуют одна или несколько цифр.

Вы не можете это изменить. Извините!

0 голосов
/ 19 сентября 2011

потому что [0] ВСЕГДА первый символ, если это строка.Вы можете проверить массив с

if (is_array($array_or_string)){
    //it's an arra
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...