Функция пробоя функции PHP isset()

У меня проблема с функцией PHP isset. Это часто и таинственно (для меня) пропуски.

Например, когда у меня есть переменная, которая может быть либо строкой, либо массивом ошибок, я пытаюсь использовать isset, чтобы увидеть, содержит ли переменная один из известных индексов массива, например:

$a = "72";
if(isset($a["ErrorTable"]))
    echo "YES";
else
    echo "NO";

Этот плохой мальчик печатает ДА ​​на моем сервере. Я попробовал это на Ideone (онлайн-переводчик, это круто!) Здесь: http://ideone.com/r6QKhK, и он печатает NO.

Я думаю, что это имеет какое-то отношение к используемой нами версии PHP. Может ли кто-то пролить свет на это?

Ответ 1

Рассмотрим следующий фрагмент кода:

$a = "72";
var_dump( isset($a["ErrorTable"]) );

Вы проверяете, установлен ли $a["ErrorTable"]. Сначала PHP выводит любое нечисловое смещение на int, и это делает ErrorTable равным 0.

По существу, вы просто делаете:

if ( isset($a[0]) ) 

Строки в PHP могут быть доступны для массива, а $a[0] определенно задано, и условие будет оцениваться как TRUE.

Однако это странное поведение было исправлено в PHP 5.4.0, а changelog для isset() говорит:

5.4.0 - проверка нечисловых смещений строк теперь возвращает FALSE.

Возможно, ваш сервер использует старую версию PHP, и это объясняет, почему он выводит YES.


Вместо этого вы можете использовать array_key_exists():

$a = "72";
if ( is_array($a) && array_key_exists('ErrorTable', $a) ) {
    echo 'YES';
} else {
    echo 'NO';
}

Вывод будет NO во всех версиях PHP.

Ответ 2

Обычно я использую пустую функцию:

$a = "72";
if(!empty($a["ErrorTable"]))
     echo "YES";
else
     echo "NO";

Ответ 3

$a [0] - это способ ссылки на 1-й символ в строке, который является значением "7". Поскольку строковые символы просто ссылаются на их числовое значение, "ErrorTable" - это тип для метода int (0)

Это относится к PHP 5.2.17 и 5.3.23, но не в 5.4.15 или 5.5.0