Pull to refresh

Парсинг GET-запроса в PHP (приколы автоматического парсинга)

Reading time2 min
Views2.4K
Сегодня решил разобраться, как PHP определяет ключ в массив $_GET для параметров, поступивших соответственно методом GET. Честно говоря, такой алогичности в работе этого механизма увидеть я не ожидал. Хотя в целом, почему так получилось, понятно…


Итак, сразу к практике. Как по-вашему мнению в $_GET будет отображена строка такого вида: "?aa[bb][cc=11"? Вариантов в принципе не так мало, среди них и логичные, и не очень. В результате в PHP получим такие ключи массива: $_GET['aa']['bb']=11. Куда делось «cc»? Что даст "?aa[bb]cc=11"? Тоже самое ($_GET['aa']['bb']=11). Куда опять делось «cc» не понятно. Но самое интересное впереди!

Что даст "?aa[bbb=11"? Конечно $_GET['aa_bbb']=11, как же можно было не угадать, это же интуитивно-понятное продолжение примеров выше :)
"?aa[bb[ccc]]=11" дает $_GET['aa']['bb[ccc']=11. Вторую скобку опять украли!

Ну и пик программы: "?[aa]=7". var_dump($_GET) выдаст: Array() — пустой массив. «А-а-а, где же мой гет?..» Наверное, логичнее было бы как минимум создать ключ $_GET['']. Врочем, во всех этих спорных случаях вариантов много и спорить об их правильности можно долго.

Вот такие метаморфозы. Частично такое поведение объясняет то, что в первых версиях языка параметры парсились не в массив, а в переменные. Тогда запретные символы было принято заменять подчеркиванием. В одном из примеров выше наблюдается такая замена. Она действует, когда данный параметр не считается массивом. А вот если параметр распознан как массив, включается новая хитрая логика, которая в одних случаях просто откидывает лишнее, в других откидывает только часть неугодного, а часть целиком пихает в ключ. Не интуитивно, не логично.

UPD. Наверное, стоит добавить, что целью этого поста ни в коем случае не является в очередной раз обругать PHP. Я отлично понимаю, что иначе врядле могло выйти в тех условиях, в которых развивался этот интересный язык :) Но, как говориться, предупрежден, значит вооружен :)
Tags:
Hubs:
Total votes 22: ↑15 and ↓7+8
Comments10

Articles