Странности PHP #2

nigirma

Новичок
Если выполнить простой код:
PHP:
$value = 'любой текст';

if (isset($value['element'])) {
    echo 'PHP тупит!!!';
} else {
    echo 'PHP рулит!';
}
то результат будет следующим: PHP тупит!!!

ПОЧЕМУ?? Ведь $value и рядом с массивом не стоял?!
 

AmdY

Пью пиво
Команда форума
убрал в корзину. хорошая видимо трава у человека.
 

nigirma

Новичок
Попытка доступа к переменным других типов (исключая массивы или объекты, реализующие определенные интерфейсы) с помощью [] или {} молча вернет NULL.
не обращал никогда на это внимания...
 

nigirma

Новичок
В изменениях в версии PHP 5.4 написано:
Нецифровые смещения строк, например $a['foo'], где $a - это строка, теперь возвращают false в функции isset() ... и вызывают предупреждение E_WARNING при подобном использовании.
Источник: Что изменилось в PHP 5.4.x ?
 

Фанат

oncle terrible
Команда форума
Нормальный вопрос, кстати.
Не для теории, конечно, но и не для корзины.
Поведение действительно неочевидное.
 

soines

Новичок
Поведение достаточно очевидное, если знать как работает приведение типов.
А вообще лучше использовать array_key_exists в таких случаях.
 

Beavis

Banned
А вообще лучше использовать array_key_exists в таких случаях.
в каких таких?

Поведение достаточно очевидное, если знать как работает приведение типов.
расскажите для конкретного случая как оно работает
 

soines

Новичок
в каких таких?


расскажите для конкретного случая как оно работает
В случае когда нужно проверить есть ли индекс в массиве.

Со строкой можно работать как с массивом ( не хеш-таблицей, а именно массивом ), индексы в нем - числа, в данном случае element превращается в единицу. Поэтому данная конструкция и возвращает true
 
  • Like
Реакции: AmdY

Redjik

Джедай-мастер
А я так, часто проверяю на существование элемент массива, придется много чего переделывать, во я тупил ...
А я инстинктивно от таких конструкций ухожу =)
Теперь тоже буду знать =)))

ЗЫ. вообще isset недолюбливаю, а проверки делаю if ($var) и if(empty($array))
ну соответсвенно - для ключа массива if ($array[$key])
 

Linker

Новичок
Изначально речь идёт о строке.
Да, есть возможность работать со строками, по тому же принципу, что и с массивом:

PHP:
$value = 'любой текст';
echo  '<table border=1 cellspacing=0 cellpadding=5><tr><td align="center">ключ:</td><td align="center">значение:</td></tr>';

     for ($i = 0; $i < strlen($value); $i++)
     {
     echo '<tr><td>'.$i.'</td><td>'.$value{$i}.'</td></tr>';
     }

echo '</table>';
если такая необходимость возникнет...
но вот это вот чего: $value['чего_это_такое_и_зачем'] ?

$value - это же строка? Более того, она уже пронумерована! Буковки-то (циферки и вообще, любые символы) по порядку там идут всегда!
Какой вообще практический смысл в проверке существования символа в строке? Разве бывают строки состоящие из вакуума?
Если мы работаем со строкой и у неё есть длина, зачем же проверять, есть ли в ней символы? Ясный пень они там есть! А как же?
 

Sufir

Я не волшебник, я только учусь
Если мы работаем со строкой и у неё есть длина, зачем же проверять, есть ли в ней символы? Ясный пень они там есть! А как же?
Ну, видимо, речь идёт о той ситуации, когда ожидается и проверяется массив, а там каким-то образом оказывается строка... Но это уже косяк не php, а разработчика.
 

Linker

Новичок
Как справедливо заметил tony2001 если на входе мусор, то и на выходе - ничего не изменилось. Неявное приведение типов - палка о двух концах. Разработчик это всегда помнит и старается максимально контролировать это дело. Инициализировать переменные значениями по-умолчанию признак хорошего тона. Так что тут, согласен, проблемы того, кто упустил этот момент...
 
Сверху