Функция пробоя функции 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