Сегодня решил разобраться, как 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. Я отлично понимаю, что иначе врядле могло выйти в тех условиях, в которых развивался этот интересный язык :) Но, как говориться, предупрежден, значит вооружен :)
Итак, сразу к практике. Как по-вашему мнению в $_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. Я отлично понимаю, что иначе врядле могло выйти в тех условиях, в которых развивался этот интересный язык :) Но, как говориться, предупрежден, значит вооружен :)