
PHP8 上級/準上級試験の認定模擬問題として、プライム・ストラテジー様のPRIME STUDYが認定されているようです。ただ、この模擬問題には解説がありませんので解説をまとめていこうと思います。シリーズ第13回目です。

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。
PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/
問題文
可変変数に関する説明の中で、誤っているものを1つ選びなさい。
(1)
PHP では、変数名を可変にする事ができる。そのため、以下のコード
declare(strict_types=1);
error_reporting(-1);
$test = 'hello';
$s = 'test';
echo $$s;
を実行すると、結果は次のとおりとなる。
hello
(2)
$を重ねて、2段以上の可変変数も、作ることは出来る。そのため、以下のコード
declare(strict_types=1);
error_reporting(-1);
$test = 'hello';
$s = 'test';
$ss = 's';
echo $$ss, PHP_EOL;
echo $$$ss;
を実行すると、結果は次のとおりとなる。
test
hello
(3)
可変変数は、PHP 5 と PHP 8 で評価の順番が異なる。
例えば「$$foo[‘bar’][‘baz’]」という可変変数がある場合、PHP 5 では「${$foo[‘bar’][‘baz’]}」、PHP 7 以降では「($$foo)[‘bar’][‘baz’] (PHP 5 でもパース可能な記法だと ${$foo}[‘bar’][‘baz’]」と解釈される。そのため、以下のコード
// declare(strict_types=1);
error_reporting(-1);
$awk['bar']['baz'] = 'aaa';
$foo = 'awk';
var_dump($$foo['bar']['baz']);
$foo2['bar']['baz'] = 'bbb';
$bbb = 'awk';
var_dump($$foo2['bar']['baz']);
を PHP 8 で実行すると、結果は次のとおりとなる。
string(3) "aaa"
Warning: Array to string conversion in …
Warning: Undefined variable $Array in …
Warning: Trying to access array offset on value of type null in …
Warning: Trying to access array offset on value of type null in …
NULL
一方で PHP 5 で実行すると、結果は次のとおりとなる。
Warning: Illegal string offset 'bar' in …
Warning: Illegal string offset 'baz' in …
Notice: Undefined variable: a in …
NULL
string(3) "awk"
そのため、波括弧 {} を使って「評価順番を明示的に書く」と、バージョンによらず互換性を保つ事ができる。
(4)
可変変数は、スーパーグローバル変数に対しても使う事ができる。そのため、以下のコード
declare(strict_types=1);
error_reporting(-1);
function hoge() {
$s = '_ENV';
echo ${$s}['SSH_TTY'], PHP_EOL;
}
echo $_ENV['SSH_TTY'], PHP_EOL;
hoge();
を実行すると、結果は次のとおりとなる。
/dev/pts/1
/dev/pts/1
解説
選択肢1の解説
正しいです。
可変変数の基本的な使い方であり、$$s のように $s の値を変数名として扱うことができます。
以下のサンプルコードで説明しましょう。
$foo = 'bar';
$bar = 'hello';
echo $$foo;
これがどうなるかというと、$foo の中身は ‘bar’ですね。つまり $$foo は $bar の意味になります。$bar の中身は ‘hello’なので、結果は ‘hello’ が出力されることとなります。
問題のコードを見てみましょう。
$test = 'hello';
$s = 'test';
echo $$s;
$s = ‘test’ で、$s の中身は ‘test’です。$$s は $test となります。$test = ‘hello’ なので、echo $$s; は echo $test; と同じです。よって hello と出力されます。
選択肢2の解説
正しいです。
2段以上の可変変数(例えば $$ss や $$$ss)も適切に動作し、順に評価されます。
選択肢3の解説
誤っています。
PHP5 と PHP7 以降で可変変数の評価順番が異なるということはありません。可変変数の評価の順番に関しては、PHP5でもPHP7以降でも同じルールが適用されています。
具体的には、$$foo[‘bar’][‘baz’] のようなコードにおいて、評価順序は以下のように解釈されます:
$$foo[‘bar’][‘baz’] は、まず $$foo が評価され、その後その結果に対して [‘bar’][‘baz’] が適用されます。
そのため、波括弧 {} を使って評価順序を明示的に書く ことが重要です。これにより、バージョンによらず一貫した動作を得ることができますが、PHP5とPHP7以降では評価順番の挙動に差異はありません。
選択肢4の解説
正しいです。
スーパーグローバル変数にも可変変数を使用することができます。${$s} のように、スーパーグローバル変数(ここでは $_ENV)にアクセスすることができます。
正解選択肢
以上より選択肢3が正解となります。
コメント