Подскажите какие настройки в PHP заставляют выполняться этот код

babnicks
На сайте с 23.10.2009
Offline
47
2440

Сегодня столкнулись с вот такой штукой на одном из хостингов:

$a = "123456789";

echo( $a[5][0] );

Выдаёт "6", хотя должен генерить ошибку "Cannot use string offset as an array in"

Может кто сталкивался? Это фишка PHP 5.4?

100% защита от спам-ботов (https://www.keycaptcha.com)
IL
На сайте с 20.04.2007
Offline
435
#1

Вообще, баг старый.. что выведут тестовые примеры со страницы

https://bugs.php.net/bug.php?id=28107 ?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#2

Зачем юзать 5,4? В нём ещё багов тоннами.

---------- Добавлено 12.10.2012 в 19:02 ----------

ivan-lev:
Вообще, баг старый.. что выведут тестовые примеры со страницы
https://bugs.php.net/bug.php?id=28107 ?

Нет такого в 5,2,17

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
babnicks
На сайте с 23.10.2009
Offline
47
#3
LEOnidUKG:
Зачем юзать 5,4? В нём ещё багов тоннами.

Мне даже 5.3 не очень чтобы был нужен :) я ведь говорю что на хостинге на каком-то виртуальном встретил эту забавность... из-за неё глючил наш плагин...

S
На сайте с 23.05.2004
Offline
316
#4

Ну в общем то логично , что нулевой элемент строки из одного символа и будет тот самый символ.

Вообще, баг старый.. что выведут тестовые примеры со страницы
https://bugs.php.net/bug.php?id=28107 ?

Это не баг. Это дурачок юзер не может понять разницу между isset и is_array функциями.

Зачем юзать 5,4? В нём ещё багов тоннами.

Перевел у себя девелоперский сервер на 5.4 , ни каких багов не встретил. Все что работало на 5.2-5.3 точно так же продолжает работать и с 5.4 Единственное с чем столкнулся, чуть строже стала проверка при работе с объектами.

Это просто подпись.
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#5
Stek:

Перевел у себя девелоперский сервер на 5.4 , ни каких багов не встретил. Все что работало на 5.2-5.3 точно так же продолжает работать и с 5.4 Единственное с чем столкнулся, чуть строже стала проверка при работе с объектами.

Вам тс выше уже описал баг, и это ещё только начала. Если у вас все проекты работают, это не значит, что нет багов.

dkameleon
На сайте с 09.12.2005
Offline
386
#6
babnicks:
Выдаёт "6", хотя должен генерить ошибку "Cannot use string offset as an array in"

не понимаю вашу логику...

1. обратиться к символу строки в ПХП можно так же, как к элементу массива.

2. вы обращаетесь к пятому символу, получаете в ответ односимвольную строку.

3. затем обращаетесь к нулевому символу односимвольной строки и получаете односимвольную строку.

LEOnidUKG:
Вам тс выше уже описал баг, и это ещё только начала. Если у вас все проекты работают, это не значит, что нет багов.

так а в чем конкретно баг?

по логике вещей так должно было работать изначально и просто был исправлен баг, предыдущих версий.

Дизайн интерьера (http://balabukha.com/)
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#7
так а в чем конкретно баг?

В том, что вызываемого элемента массива не существует.

dkameleon
На сайте с 09.12.2005
Offline
386
#8
LEOnidUKG:
В том, что вызываемого элемента массива не существует.

но здесь нет работы с массивами. в примере обыкновенная работа со строками.

http://php.net/manual/en/language.types.string.php

вот тут описано отличие между 5.3 и 5.4:

As of PHP 5.4 string offsets have to either be integers or integer-like strings, otherwise a warning will be thrown. Previously an offset like "foo" was silently cast to 0.

и пример №10 там же.

KS
На сайте с 11.06.2012
Offline
17
#9

Хочу поддержать товарища dkameleon. Во многих языках программирования обращение к символам строк как к элементам массива является законным и общепринятым приёмом. В уже упомянутой статье документации так же явно сказано:

Characters within strings may be accessed and modified by specifying the zero-based offset of the desired character after the string using square array brackets, as in $str[42]. Think of a string as an array of characters for this purpose.

Что можно перевести как: "Можно обращаться и изменять буквы в строках используя индекс (начинающийся с 0) в квадратных скобках, типа $str[42]. Для таких случаев можешь считать строку массивом букв."

FileSafe (http://filesafe.anek.ws/) - мониторинг неизменности файлов сайта для защиты от взлома. Для форумчан - первый год бесплатно.
S
На сайте с 23.05.2004
Offline
316
#10
В том, что вызываемого элемента массива не существует.

Строка и есть массив.

Вам тс выше уже описал баг, и это ещё только начала. Если у вас все проекты работают, это не значит, что нет багов.

Еще раз - это не баг. Почитайте мануалы по пхп, что он подразумевает под строками и почему со строкой можно работать как с массивом. А заодно что такое нулевой элемент в массиве.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий