3

このコードがあるとします(簡略化された例):

$propertyName = 'items';
$foo = new \stdClass;
$foo->$propertyName = array(42);

この時点で、配列内の値への参照を評価する式を記述したいと思います。

これを行うことは可能ですか?もしそうなら、どのように?

「仕事をする」が、私が探しているものではない答えはこれです:

// Not acceptable: two statements
$temp = &$foo->$propertyName;
$temp = &$temp[0];

しかし、なぜそれを2つのステートメントとして書くのでしょうか。まあ、これはうまくいかないので:

// Will not work: PHP's fantastic grammar strikes again
// This is actually equivalent to $temp = &$foo->i
$temp = &$foo->$propertyName[0];

もちろん&$foo->items[0]、プロパティ名を修正するため、別の受け入れられない解決策です。

誰かが奇妙な要件について疑問に思っている場合:私はループ内でこれを行っています。ループ内では、$fooそれ自体がグラフ内のノードへの参照です。次の反復で設定してもグラフが完全に台無しにならないように、関連するソリューションには後で$temp必要になります。参照に細心の注意を払わないと、この要件を見落とす可能性があるため、バグを引き起こす可能性が少なくなるようにこのコードを記述する方法があるかどうか疑問に思いました。unset($temp)$tempunset

4

2 に答える 2

4

このようなあいまいな式には、パーサーの助けが必要です。

$temp = &$foo->{$propertyName}[0];

ところで、これは、変数のエイリアス (別名参照) を探している場合でも、値だけを探している場合でも同じです。配列アクセス表記を使用する場合は、両方とも必要です。

于 2012-06-05T12:41:23.167 に答える
2

いくつかのグーグルが必要でしたが、解決策を見つけました:

$propertyName = 'items';
$foo = new \stdClass;
$foo->$propertyName = array(42);

$temp = &$foo->{$propertyName}[0]; // note the brackets

$temp++;

echo $temp;
print_r($foo->$propertyName);

これは印刷されます43 array(43)

この記事で解決策を見つけました: Jeff Beeman による変数オブジェクト プロパティの配列の参照

于 2012-06-05T12:41:39.573 に答える