新しい PHP 7.0.0 が出たので、いわゆる「可変変数」の評価順序の変更が少し心配です。
このページの「変数処理の変更点」の下に、PHP 5 および PHP 7 での処理順序を含む式の例を示す表が表示されます。リストされている 4 つの式は次のとおりです。
$$foo['bar']['baz']
$foo->$bar['baz']
$foo->$bar['baz']()
Foo::$bar['baz']()
次の文字列と配列があるとします。
$qux = 'quux';
$foo = array('bar' => array('baz' => 'qux'));
表の最初の式は$$foo['bar']['baz']
、PHP 5 では の値として名前が付けられた変数の値として解釈されます。$foo['bar']['baz']
つまり、 の値$qux
は です 'quux'
。
ただし、PHP 7 では、私が理解しているように、同じ式が の値として名前が付けられた変数として解釈され$foo
ます$foo
。
表の他の例は、これと同じテーマのバリエーションのようです。
もちろん、PHP 7 でこれが変更された理由 (具体的には、この変更が下位互換性よりも重要である理由) に興味がありますが、それは SO には適切な質問ではありません。私の質問はより実用的です:
この非互換性に対処するための推奨される方法は何ですか?
もちろん、問題のある式に中括弧を追加すると ( ${$foo['bar']['baz']}
、$foo->{$bar['baz']}
、$foo->{$bar['baz']}()
およびFoo::{$bar['baz']}()
) が役立ちますが、これは非常に面倒で、大量の古いコードを調べて、比較的少ない出現箇所を検索します...
そうでなければ、これらの 4 つの例は可能な唯一の構文のバリエーションですか? つまり、RegExp とgrep
問題のあるすべてのコードを作成できますか? 他にどのようなバリエーションが存在する可能性がありますか?