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

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。

今回は可変変数に関する問題です。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 以降で可変変数の評価順番が異なりますので注意が必要です。
選択肢4の解説
誤りです。
スーパーグローバル変数にも可変変数を使用することができます。${$s} のように、スーパーグローバル変数(ここでは $_ENV)にアクセスすることができます。
正解選択肢
以上より選択肢4が正解となります。
他の問題へ
模擬問題(1)インストール
模擬問題(2)変数の型
模擬問題(3)クラス
模擬問題(4)メソッドその1
模擬問題(5)メソッドその2
模擬問題(6)リファレンス
模擬問題(7)名前空間
模擬問題(8)エラー
模擬問題(9)定義済みのインターフェイスとクラスおよび SPL インターフェイス
模擬問題(10)SPL
模擬問題(11)定義済の変数
模擬問題(12)PHP7.0.xからPHP7.1.xへの移行
模擬問題(13)可変変数
模擬問題(14)PHP7.3.xからPHP7.4.xへの移行
模擬問題(15)PHP7.4.xからPHP8.0.xへの移行
模擬問題(16)制御構造
模擬問題(17)XSS(クロスサイトスクリプティング)
模擬問題(18)ファイルアップロード
模擬問題(19)推測困難なトークン
模擬問題(20)セッション
模擬問題(21)PHP のメモリ消費
模擬問題(22)関数その1
模擬問題(23)関数その2
模擬問題(24)関数その3
模擬問題(25)関数その4
模擬問題(26)関数その5
模擬問題(27)関数その6
模擬問題(28)関数その7
模擬問題(29)関数その8
模擬問題(30)関数その9
コメント