Доступ к массиву PHP без кавычек

я постучал к явлению в существующем источнике php, с доступом к полю без апострофа, как это: $_GET[test].

Я не уверен, и не знаю, что это возможный путь, поэтому я написал короткий пример для тестирования:

echo "Array Test, fields without apostrophe, like $_GET[fieldname]<BR><BR>";
$a = array();
$a['test'] = "ArrayValue";
echo "case 1 -> $a['test']: " . $a['test'] . "<BR>";
echo "case 2 -> $a["test"]: " . $a["test"] . "<BR>";
echo "case 3 -> $a[test]: " . $a[test] . "<BR>";

и он работает, каждый результат получил значение (ArrayValue).

Я предпочитаю метод доступа, такой как Случай 2.

является ли случай 3 нормальным, разрешенным стилем кодирования в php?

3 ответов


что здесь происходит, так это то, что PHP видит постоянной под названием test. Если константа определена, значение возвращается, оно не определено, PHP возвращается в строку "test". Например:

$array = array("A" => "Foo", "B" => "Bar", "C" => "Baz")
define("B", "C");

echo $array[A];   // The constant "A" is undefined, 
                  // so PHP falls back to the string "A", 
                  // which has the value "Foo".
echo $array["B"]; // The result is "Bar".
echo $array[B];   // The value of constant "B" is the string "C".
                  // The result is "Baz".

Это для обратной совместимости, и вы никогда не должны использовать его. Если ты ... --8-->включить уведомления, вы увидите, что PHP жалуется на это.


Если вы не поместите ключ в кавычки, он будет обрабатываться как неопределенная константа (при условии, что она нигде не определена), которая может работать сейчас, но может потерпеть неудачу в будущих версиях PHP. Поэтому это просто неправильно, и в документации PHP этот вариант также указан как неправильный. Проверьте'массивы делать и чего не делать'.

кстати: если вы поместите ключ в двойные кавычки, он отображает переменные внутри имени ключа.


использование имен ключей массива без кавычек является устаревшей функцией в PHP. Первоначально это был способ сделать это, но он больше не рекомендуется и поддерживается только для обратной совместимости. Он выдаст предупреждающее сообщение, если у вас включен строгий режим.

причина, по которой он работает, заключается в том, что он видит имя ключа в этой форме как константу. Когда PHP видит неизвестную константу, по умолчанию в качестве значения используется имя константы, поэтому она работает как строка замена.

он сломался бы, если бы вы define() в другом месте вашей программы, которые устанавливают значение этой константы. Он также не работает, если ваше имя ключа содержит пробелы, начинается с цифры или является недопустимым постоянным именем по любой другой причине.

по этим причинам, не рекомендуется использовать этот метод.

но больше всего разработчики PHP публично заявили, что это не хорошая практика, что вполне может означать, что будущие версии PHP удаляют возможность писать такой код.