У меня проблема с функцией isset PHP. Это часто и таинственно (для меня) пропуски.
Например, когда у меня есть переменная, которая может быть либо строкой, либо массивом ошибок, я пытаюсь использовать isset, чтобы увидеть, содержит ли переменная один из известных индексов массива, например:
$a = "72"; if(isset($a["ErrorTable"])) echo "YES"; else echo "NO";
Этот плохой мальчик печатает ДА на моем сервере. Я попробовал это на Ideone (онлайн-интерпретатор thingie. Это круто!) Здесь: http://ideone.com/r6QKhK, и он печатает НЕТ.
Я думаю, что это имеет какое-то отношение к используемой нами версии PHP. Может ли кто-то пролить свет на это?
Рассмотрим следующий фрагмент кода:
$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, а журнал изменений для isset()
говорит:
5.4.0. Проверка нечисловых смещений строк теперь возвращает FALSE.
Вероятно, ваш сервер использует старую версию PHP, и это объясняет, почему она выводит YES
.
array_key_exists()
этого вы можете использовать array_key_exists()
:
$a = "72"; if ( is_array($a) && array_key_exists('ErrorTable', $a) ) { echo 'YES'; } else { echo 'NO'; }
Выход будет NO
во всех версиях PHP.
Обычно я использую пустую функцию:
$a = "72"; if(!empty($a["ErrorTable"])) echo "YES"; else echo "NO";
$ a [0] – это способ ссылки на 1-й символ в строке, который является значением «7». Поскольку строковые символы просто ссылаются на их числовое значение, «ErrorTable» представляет собой метод для метода int (0)
Это имеет место в PHP 5.2.17 и 5.3.23, но не в 5.4.15 или 5.5.0