1

配列を指す可変変数がどのように処理されるのか疑問に思っています。以下のコードをご覧ください。

$a = new stdClass(); 
$a->b = array('start' => 2); 
$c = 'b'; 
$d = 'start';
print $a->$c; // => Array
print $a->$c['start']; // => Array
print $a->$c[0]; // => Array
print $a->$c[0][0]; //=> PHP Fatal error:  Cannot use string offset as an array in php shell code on line 1

私が期待する最初の版画、私が期待しない 2 番目の版画、または 3 番目の版画。$a->$c の評価が明らかに文字列であることを認識した後、4 番目が期待されます。しかし、なぜこれが機能するのですか:

$t = $a->$c;
print $t['start']; //=> 2

うまくやる方法を知る必要があるというよりも、興味があるのでもっと質問しています

$e = 'start';
$a->$c[$e]

変数変数の使用によって返される配列に直接インデックスを付けることができない理由を知っている人はいますか?

4

2 に答える 2

1

それは、操作の順序と、PHP 型がどのようにジャグリングするかにかかっています。ヒント:var_dumpはあなたの友達です。echo常に文字列にキャストするため、特にデバッグ設定で変数値を分析するには最悪の操作です。

次の点を考慮してください。

var_dump($a->$c); // array (size=1) / 'start' => int 2
var_dump($a->$c['start']); // array (size=1) / 'start' => int 2
var_dump($a->b['start']); // int 2
var_dump($c['start']); // string 'b' (length=1)

ここで重要なのは、PHP が$c['start']($c[0]ここにも含めて) の部分をどのように解釈するかです。$cは stringであり、string のインデックス'b'を取得しようとすると、' これは単にstring の最初の文字を返します。これはたまたま文字列内の唯一の文字 (b) です。を使用してこれをテストできます-同じ結果が得られます(この特定のケースでは)。また、;とまったく同じ結果が得られます。考えて、私がリンクした必要な読み物を確実に行うようにしてください。'start''b$c = 'bcdefg';$c['bogus']$c['start']

したがって、これを念頭に置いて ($c['start'] しぶしぶが返されることを知って'b')、式$a->$c['start']は で解釈され$a->bます。つまり、順序は であり、 では$a->($c['start'])ありません($a->$c)['start']

残念ながら、パーサー (PHP s) を使用し()たり操作したりすることはできないため、1 行で目的を達成することはできません。以下が機能します。{}SCREAM

$e = 'start';
$interim = $a->$c;
echo $interim[$e];

または、配列をオブジェクトとしてキャストすることもできます (余裕がある場合)。

$a->$c = (object) $a->$c; // mutate
var_dump($a->$c->$e);

$interim = (object) $a->$c; // clone
var_dump($interim->$e);

...ちなみに、 と に戻って参照する$c['start']$c[0]、 はstring 内の文字$c[0][0]であるため、これを行うことはできません。文字/バイトにアクセスする場合、プロパティはありません。$c[0] b'b'b[0]

于 2013-10-30T16:57:35.657 に答える
0

$a->$c[0];実際には次と等しい:array('start' => 0)

あなたがしたとき:

print $a->$c[0][0];

存在しない$a->$c[0]インデックスから配列要素をロードしようとしています。0

ただし、これは機能します。

print $a->$c[0]['start'];

于 2013-10-30T16:40:09.597 に答える