2013-06-26 5 views
11

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

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

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

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

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

+0

какую версию PHP вы используете? – user20232359723568423357842364

+13

Добро пожаловать: http://3v4l.org/f9fNp – PeeHaa

+0

@PeeHaa: Пожалуйста, опубликуйте это как ответ, чтобы будущие читатели могли его видеть, не полагаясь на внешний сайт. –

ответ

11

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

$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.

+0

Ссылка на это сообщение phpdoc для этой информации? Было бы здорово получить полностью описанный ответ на этот вопрос. ;) –

+0

@dragoste: см. Обновленный ответ :) –

+0

Вопрос в том, почему он работает с PHP 5.0.0, в то время как phpdoc говорит, что это с PHP 5.4.0. ;> –

-1

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

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

0

Я обычно использую пустую функцию, как:

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