Некоторые эзотерические явления кода для вас сегодня… В этом посте я объясняю, как PHP обрабатывает массивы, когда они включены в URL запросах (через строку запроса). Это то, чего я не понимал до тех пор, пока не занялся глубокой разработкой своего профессионального плагина брандмауэра WordPress. Теперь давайте начнем…
Передача массивов через строку запроса
При создании URL-адреса вы можете включить массив значений в качестве параметров строки запроса, например, так:
Literal: http://example.com/?paged=1&post[]=1179&post[]=1178
Encoded: http://example.com/?paged=1&post%5B%5D=1179&post%5B%5D=1178
Другими словами, если у нас есть следующий массив:
$post = array('1179', '1178');
Это эквивалентно следующему параметру строки запроса:
post[]=1179&post[]=1178
Мы можем получить этот массив через PHP, используя $_GET['post']
.
Другой пример, рассмотрим этот простой массив:
array(1, 2, 3, 4, 5)
… это будет записано как:
array[]=1&array[]=2&array[]=3&array[]=4&array[]=5
И мы можем получить этот массив через PHP, используя $_GET['array']
.
В основном это то, что мы рассматриваем в этой статье. Когда-то я думал, что подобные запросы GET
рассматриваются PHP как строки. Как же я ошибался…
Получение массивов через строку запроса
Чтобы понять, как принимать/интерпретировать массивы, передаваемые через строку запроса, создайте файл с именем test.php
и добавьте в него следующий код:
if (is_array($_GET['post'])) die(var_dump($_GET['post']));
После загрузки файла на ваш сервер, зайдите в браузер и запросите следующее URI:
http://example.com/test.php?paged=1&post[]=1179&post[]=1178
Результат будет примерно таким:
array(2) { [0]=> string(4) "1179" [1]=> string(9) "1178" }
Затем повторите тест, используя кодированный массив, и результаты должны быть такими же. Итак, мораль этой истории такова: вы можете отправить массив по протоколу HTTP запросы, как в буквальном, так и в кодированном виде. Надеюсь, этот пост прольет свет на эту эзотерическую функциональность.
Кстати, если уж на то пошло, мой плагин BBQ Pro правильно анализирует массивы строк запросов (как буквальные, так и закодированные) во всех типах запросов: GET, POST, PUT, DELETE и т.д. Так что плохие парни ничего не протащат через массивы строк запросов 😉