Объясните этот фрагмент PHP для меня: возвращаем массив и сразу ссылаемся на индекс
<?php
function ReturnArray() {
return array('a' => 'f', 'b' => 'g', 'c' => 'h', 'd' => 'i', 'e' => 'j');
}
echo ${!${!1}=ReturnArray()}['a']; // 'f'
?>
Пожалуйста, объясните, что логика и шаг вычисления с этими ${! 1} в приведенном выше разрешении работают хорошо.
Ответы
Ответ 1
Давайте начнем с некоторых основ. В PHP что-то вроде hello
будет оценивать строку "hello"
. Чтобы ссылаться на переменную, вы можете использовать этот синтаксис: ${expr}
. Для этого также сокращенно $foo
, который будет примерно соответствовать этому: ${"foo"}
.
Кроме того, вы, вероятно, знаете, что вы можете сразу назначить несколько переменных: $a=$b=$c='hello';
, например. Это назначит $a
, $b
и $c
на 'hello'
. Это фактически представлено как $a=($b=($c='hello')));
. $foo=value
- это выражение, которое после установки $foo
будет оцениваться как value
.
Ваша инструкция кода выглядит следующим образом:
echo ${!${!1}=ReturnArray()}['a'];
Первое, что он делает, очевидно, это вызов ReturnArray
. Затем он оценивает !1
, который вычисляет значение false. Следовательно, ${!1}
делает переменную с именем false
, но не строкой (?!). После этого он применяет не операцию к массиву. Все непустые массивы являются правдивыми, поэтому операция не меняет ее на false
. Затем он использует этот синтаксис ${}
для получения переменной с именем false
. Затем он использует доступ к массиву для извлечения значения в массиве для ключа 'a'
.
Я надеюсь, что это имело смысл.
Ответ 2
-
!1
= false
-
${!1}
= NULL
-
${!1} = ReturnArray()
= array ('a' = > 'f', 'b' = > 'g', 'c' = > 'h', 'd' = > 'i', 'e' = > 'j')
- так что теперь $NULL содержит массив
и снова мы видим конструкцию
${!(condition)
, которая означает $NULL (см. первую и вторую точки), поэтому мы можем преобразовать ее в:
-
$NULL['a']
(и $NULL содержит массив)
Вы можете легко проверить это:
print_r(${NULL});
- вы увидите массив;)
Ответ 3
${!1}
оценивается как ${false}
!${false = ReturnArray()}
оценивается как $true = array('a' => 'f', /* etc */)
.
echo $true['a']
создает 'f'
, поскольку 'f'
соответствует индексу 'a'
Мне сейчас интересно, что это такое?
Ответ 4
Между тем у меня есть ответ, поэтому я размещаю его здесь:
echo ${!${!1}=ReturnArray()}['a'];
${!${!1}=ReturnArray()}['a']
!1 resolves to false.
${!${false}=ReturnArray()}['a']
false resolves to... I don't know. Let just say false resolves to a variable "a".
${!$a=ReturnArray()}['a']
$a is now the array. The ! changes the returned array into the boolean false (like: if (!$handle = fopen('x', 'r')) { echo 'connection failed' }.
${false}['a']
I don't know what false resolves to, but we're using again variable "a".
$a['a'] // this is trivial
Ответ 5
ИМХО, это в основном чистый шум. Код присваивает массив переменной, а затем извлекает ключ a
, который, очевидно, f
. Я просто использую booleans для генерации промежуточных имен переменных и позволяю PHP применять их к строкам.