isset странное поведение и функция обработки возвращаемых данных

Может ли кто-нибудь объяснить мне, почему следующая строка кода выводит true?

$a = "string";

if(isset($a['error'])) echo true; else echo false;

Когда я выполняю вызов функции, я возвращаю ожидаемые данные, если она работает правильно, или возвращаю array("error" => $error);

Затем, получив возвращенные данные, я проверяю, isset($var['error']) и если нет, то я знаю, что получил некоторые ожидаемые данные.

Я также был бы признателен, если бы вы могли посоветовать мне, хороший это или плохой способ обработки данных между вызовами функций? И если для этого есть лучшая «хорошая практика».


person Martin Currah    schedule 19.01.2013    source источник
comment
Используемые исключения в случае исключительных ситуаций. Вы не должны неправильно использовать возвращаемые значения для информации о состоянии. Также обратите внимание, что ваш подход будет вести себя иначе с 5.4. codepad.viper-7.com/11HMOS   -  person KingCrunch    schedule 19.01.2013
comment
Хорошо!   -  person melpomene    schedule 19.01.2013
comment
Почему мой вопрос получил -1? Разве это не был достаточно хороший вопрос для экспертов?   -  person Martin Currah    schedule 19.01.2013


Ответы (3)


Что ж, это некоторые из ошибок в поведении PHP, которые, к счастью, были исправлены в какой-то из последних версий.

Вы можете обратиться к одному символу в строке, используя те же квадратные скобки, которые используются для адресации элемента массива.

'error' оценивается как 0, а затем у вас есть $a[0], который установлен.

чтобы исправить это, вы должны сначала проверить, является ли $a массивом

person Your Common Sense    schedule 19.01.2013
comment
это ошибка, так как волшебство происходит, если вы используете $a = str_split("string)"; :) - person Peter; 19.01.2013
comment
Благодарю вас! Я не знал, что это так. - person Martin Currah; 19.01.2013

Я считаю, что это ошибка, и она исправлена ​​в PHP 5.4+: http://codepad.viper-7.com/fz1rnT

выглядит как isset($str[$key]) так же, как isset($str[intval($key)]), где $str и $key — строки

Для обработки ошибок лучшим подходом являются исключения:

person Peter    schedule 19.01.2013

Я не уверен на 100%, почему такое поведение, но я знаю, что PHP позволяет вам обрабатывать строки так же, как массив.

$a = "StackOverflow";

echo $a[2]; // a
echo $a[4]; // k
echo $a[6]; // v
echo $a[8]; // r

Теперь, когда вы передаете строковый ключ в качестве индекса массива, PHP попытается преобразовать эту строку в числовое значение для использования в качестве ключа.

echo $a['stack']; // S
echo $a['over']; // S
echo $a['flow']; // S

echo $a['0stack']; // S
echo $a['1over']; // t
echo $a['2flow']; // a
echo $a['3flow']; // c
echo $a['4flow']; // k
person Lix    schedule 19.01.2013
comment
@melpomene да, поскольку intval('5abcde'); это 5 - person Peter; 19.01.2013
comment
@mel -true true true ... Спасибо за это - я внес некоторые изменения. - person Lix; 19.01.2013