コンテンツにスキップ

ntorelabo

Front End Developer

  • pickup
  • WordPress
  • PHP
    • PHP技術者認定試験
  • Docker
  • Next.js
  • AWS
  • Laravel
  • site map
  • search

ntorelabo

Front End Developer

  • search
  • pickup
  • WordPress
  • PHP
    • PHP技術者認定試験
  • Docker
  • Next.js
  • AWS
  • Laravel
  • site map

【php8上級/準上級試験】模擬問題解説 問題13. 可変変数

  • ホームページ
  • 【php8上級/準上級試験】模擬問題解説 問題13. 可変変数
  • 2月, 木, 2025
  • PHP
【php8上級/準上級試験】模擬問題解説 問題13. 可変変数

Contents [hide]

  • 1 「第1回 PHP 8 上級 模擬試験」を解説していきます
    • 1.1 解説記事一覧
  • 2 模擬問題 13
    • 2.1 可変変数の仕組み
    • 2.2 PHP 5とPHP 7以降(8含む)では多段の可変変数の評価順が違う
    • 2.3 スーパーグローバル変数($_ENV, $_GET, $_POSTなど)は可変変数の形式で参照することができません

「第1回 PHP 8 上級 模擬試験」を解説していきます

本記事ではひたすら下記記事の模擬試験の解説をしていきたいと思います!

第1回 PHP 8 上級 模擬試験
https://study.prime-strategy.co.jp/study/ph8ex1/

解説記事一覧

  • 【php8上級/準上級試験】模擬問題解説 問題1.~ 3. abstract staticメソッド 整数オーバーフロー
  • 【php8上級/準上級試験】模擬問題解説 問題4. __construct() __destruct __call() __callStatic()
  • 【php8上級/準上級試験】模擬問題解説 問題5. __toString() 「例外を投げる(throw new \Exception)とは?」 __invoke() __get() __debugInfo()
  • 【php8上級/準上級試験】模擬問題解説 問題6. &参照(リファレンス)unset()
  • 【php8上級/準上級試験】模擬問題解説 問題7. 名前空間とグローバル空間 use エイリアス(as)
  • 【php8上級/準上級試験】模擬問題解説 問題8. error_reporting set_error_handler() 例外捕捉 try catch
  • 【php8上級/準上級試験】模擬問題解説 問題9. interface implements ArrayAccess
  • 【php8上級/準上級試験】模擬問題解説 問題10. SPL RecursiveDirectoryIterator RecursiveIteratorIterator SplFileInfo SplFileObject
  • 【php8上級/準上級試験】模擬問題解説 問題11. $_SERVER $GLOBALS $argv $_COOKIE
  • 【php8上級/準上級試験】模擬問題解説 問題12. list() iterable
  • 【php8上級/準上級試験】模擬問題解説 問題13. 可変変数
  • 【php8上級/準上級試験】模擬問題解説 問題14. クラスの型宣言 Null合体代入演算子(??=)
  • 【php8上級/準上級試験】模擬問題解説 問題15. private final
  • 【php8上級/準上級試験】模擬問題解説 問題16. if for break
  • 【php8上級/準上級試験】模擬問題解説 問題17. XSS (クロスサイトスクリプティング) htmlspecialchars()
  • 【php8上級/準上級試験】模擬問題解説 問題18. $_FILES
  • 【php8上級/準上級試験】模擬問題解説 問題19. CSRF (Cross-Site Request Forgery) random_bytes()
  • 【php8上級/準上級試験】模擬問題解説 問題20. $_SESSION
  • 【php8上級/準上級試験】模擬問題解説 問題21. ガベージコレクション xdebug_debug_zval()
  • 【php8上級/準上級試験】模擬問題解説 問題22. Directory DirectoryIterator SeekableIterator
  • 【php8上級/準上級試験】模擬問題解説 問題23.mail()
  • 【php8上級/準上級試験】模擬問題解説 問題24. escapeshellarg() escapeshellcmd()
  • 【php8上級/準上級試験】模擬問題解説 問題25 php:// stream_wrapper_register
  • 【php8上級/準上級試験】模擬問題解説 問題26 htmlspecialchars() htmlentities() strpos()
  • 【php8上級/準上級試験】模擬問題解説 問題27 Phar __HALT_COMPILER()
  • 【php8上級/準上級試験】模擬問題解説 問題28 function_exists()
  • 【php8上級/準上級試験】模擬問題解説 問題29 openssl_encrypt() openssl_decrypt()
  • 【php8上級/準上級試験】模擬問題解説 問題30 strtotime()
  • PHP セッション名の変更方法と php.ini の記述方法まとめ
  • モダンなPHPコードで使用!無名関数の使い方
  • 【PHP】stdClass を使用して(object) でキャスト
  • 【PHP】プロトコル / ラッパーについて(file:// php:// http:// https://)
  • 「PHPでJSONを扱う」json_encodeとjson_decode完全ガイド
  • 【PHP】新しい方の指定方法「nullable」
  • 【PHP】switch分の書き方、PHP 7.3 から PHP7.4の変更点

模擬問題 13

可変変数に関する説明の中で、誤っているものを1つ選びなさい。

PHP では、変数名を可変にする事ができる。そのため、以下のコード

declare(strict_types=1);
error_reporting(-1);

$test = 'hello';
$s = 'test';
echo $$s;

を実行すると、結果は次のとおりとなる。

hello

可変変数の仕組み

PHP では、文字列の内容を 変数名 として使う “可変変数 (variable variables)” 機能があります。

PHP 可変変数の二重変換イメージ $s ‘test’ $$s ( = $test ) ‘hello’ 1. $s に文字列 “test” を代入 → 2. ‘test’ が変数名として解釈され → 3. $$s は $test を指す → 4. 最終的に “hello” を取得

従って、この説明に誤りはありません。内容は⭕です

$を重ねて、2段以上の可変変数も、作ることは出来る。そのため、以下のコード

declare(strict_types=1);
error_reporting(-1);

$test = 'hello';
$s = 'test';
$ss = 's';
echo $$ss, PHP_EOL;
echo $$$ss;

を実行すると、結果は次のとおりとなる。

test
hello

PHP では可変変数を $$ のように重ねて複数段で使うことが可能で問題文の内容は正しい⭕です

可変変数は、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”

そのため、波括弧 {} を使って「評価順番を明示的に書く」と、バージョンによらず互換性を保つ事ができる。

PHP5では、$$foo[‘bar’] のような式は 複合構文の最外部の変数部分を最後に解決する という方針でした。

PHP 5とPHP 7以降(8含む)では多段の可変変数の評価順が違う

下記の通りのため、バージョン差異をなくしたい場合は、このように波括弧を使った書き方が推奨されます。

PHP5とPHP7の可変変数評価順序の違い 専門用語の説明: ・可変変数: 変数名が別の変数の値によって決まる変数のこと。例: $$foo は $fooの値を変数名とする ・評価順序: プログラムがコードを解釈する際の処理の順番 ・メンバアクセス演算子: 配列やオブジェクトの要素にアクセスする記号。例: [‘bar’] や ->property PHP5 の評価順序 $foo = ‘bar’; $bar = [‘baz’ => ‘hello’]; $$foo[‘baz’]; PHP5の解釈: 1. $$foo[‘baz’] → ${$foo[‘baz’]} 2. $foo[‘baz’] を評価 3. $foo は ‘bar’ 4. ‘bar'[‘baz’] はエラー ※配列アクセスの前に変数名を解決 ※エラーまたは未定義の動作 PHP7 の評価順序 $foo = ‘bar’; $bar = [‘baz’ => ‘hello’]; $$foo[‘baz’]; PHP7の解釈: 1. $$foo[‘baz’] → ($$foo)[‘baz’] 2. $$foo を評価 3. $$foo は $bar 4. $bar[‘baz’] は ‘hello’ ※変数を先に解決してから配列アクセス ※一般的な言語の動作に近い 明示的な書き方: ${$foo[‘baz’]} (PHP5スタイル) または ($$foo)[‘baz’] (PHP7スタイル)

よって選択肢の内容は正しい⭕です

可変変数は、スーパーグローバル変数に対しても使う事ができる。そのため、以下のコード

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

スーパーグローバル変数($_ENV, $_GET, $_POSTなど)は可変変数の形式で参照することができません

可変変数とスーパーグローバル変数 通常の可変変数(動作する) $name = “hello”; $hello = “World”; echo ${$name}; // “World” スーパーグローバル(動作しない) $s = ‘_ENV’; echo ${$s}[‘SSH_TTY’]; // エラー 重要な注意点 • スーパーグローバル変数は可変変数の形式で参照できない • PHPの言語仕様による制限

よって問題文は❌誤りです

問題番号正解の選択肢
1PHPの「最新以外の(古い)コード」は、公式サイトでの提供は全くしていない。そのため、古いバージョンのコードが必要な場合、別途「非公式の外部サイト」からソースコードを入手する必要がある。
2論理型 (boolean) は「真偽値」とも呼ばれ、値は true か false か null のいずれかになる。なお、true、false、null の文字は、大文字でも小文字でもよい。
3抽象クラスから継承する際、親クラスで abstract としてマークされた全てのメソッドは子クラスで定義する必要があり、可視性は同等(またはより緩い制約)で、必須引数の数は同じであれば型宣言が異なってもかまわない。
4PHP において、デストラクタは __destruct() メソッドで実装される。親クラスのデストラクタは暗黙的に呼ばれ、呼び出し順序は「子クラスのデストラクタ → 親クラスのデストラクタ」となる。
5__get() はアクセス不能(protected または private)または存在しないプロパティからデータを読み込む際に使用される。なお、__getStatic() は存在せず、オブジェクトや静的コンテキストで動作しない。
6PHP のリファレンス渡しを使用すると、関数内で引数を修正できる。(※※正解テキストでは「呼び出す側で変数に & を付ける必要がある」と記載されています。)
7名前空間は namespace キーワードで宣言する。通常はファイルの先頭に記述する必要があり、名前空間宣言前に書かれたクラスはその名前空間に含まれない。
8PHP 5 では Exception クラスが全例外の基底クラスだったが、PHP 7 以降は Exception クラスは Throwable インタフェースを基底とし、Error クラスが内部エラーの基底クラスとして導入された。
9ArrayAccess インターフェイスは、オブジェクトを配列としてアクセスするための機能を提供する。
10SplFileInfo クラスは、ファイルの情報取得や操作を行うためのクラスである。
11$_COOKIE は、HTTP クッキーから渡された値が連想配列として格納され、また設定も可能である。
12PHP 7.1.x では、文字列操作関数で負のオフセット指定が可能となり、[] や {} による文字単位のアクセスも文字列の末尾からのオフセットとして解釈される。
13可変変数は、スーパーグローバル変数にも使用できる。
14PHP 7.4.x では、波括弧を使った配列や文字列のオフセットアクセスの文法は非推奨となった。
15PHP 8 では、private メソッドの継承に関するルールが変更され、親クラスの同名メソッドの可視性に関係なく子クラスでオーバーライド可能となった。
16break は、現在実行中の for, foreach, while, do-while, switch 構造の実行を終了し、オプションでネストしたループの何段分を抜けるか指定できる。
17XSS 対策として、htmlentities() を適切に使用することで、文字列や配列の入力に対して安全な出力が可能となる。
18アップロードされたファイルの元のファイル名は、$_FILES[‘{formのnameの値}’][‘name’] に格納され、move_uploaded_file() の第二引数として利用できる。
19uniqid() と mt_rand() を組み合わせることで、暗号論的にランダムな(推測困難な)トークンを生成できる。
20PHP のセッションでは、セッション ID がクッキーに保存され、session_set_cookie_params() によりそのクッキーのパラメータを設定できる。
21PHP の変数の参照カウントは、xdebug_debug_zval() で確認でき、オブジェクトを clone した場合は内部的に参照が使われ、一時的に参照カウントが増加する。
22DirectoryIterator クラスは、ディレクトリ内のファイルやサブディレクトリの情報を取得するシンプルなインターフェイスを提供する。
23mail() 関数は、メールを送信するための関数で、第四引数で追加のヘッダー情報を指定できる。
24escapeshellarg() と escapeshellcmd() は、外部入力をシェルコマンドの引数として使用する際に必要なエスケープ処理を行い、どちらを使用しても意味合いは同じである。
25stream_wrapper_register() 関数を使用すると、新しいストリームラッパー(プロトコルハンドラ)を登録できるが、既に存在する場合は失敗する。
26strpos() 関数は、文字列内で指定した部分文字列の最初の出現位置を返し、見つからなければ false を返す。ただし、先頭位置の場合は 0 が返るため注意が必要。
27Phar のスタブには __HALT_COMPILER() が使用され、これ以降のコードはコンパイルされない。
28function_exists() 関数は、指定された関数が定義されているかどうかをチェックし、存在すれば true を返す。
29openssl_decrypt() 関数は、openssl_encrypt() で暗号化されたデータを正しく復号し、元のデータを取り戻す。
30strtotime() 関数は、英語形式の日付文字列を Unix タイムスタンプに変換し、無効な日付の場合は false を返す。
php8上級/準上級試験
最近の投稿
  • さくらインターネットからWHOIS登録メールアドレスの利用廃止のメールが来た 2025年5月9日
  • スムーズにスクロールする処理をjQueryで実装 2025年5月5日
  • Google Workspace Labsとは始め方 2025年4月24日
  • Google Cloud の始め方 2025年4月20日
  • 【PHP】switch分の書き方、PHP 7.3 から PHP7.4の変更点 2025年4月19日
  • 【PHP】新しい方の指定方法「nullable」 2025年3月25日
  • 「PHPでJSONを扱う」json_encodeとjson_decode完全ガイド 2025年3月23日
  • 【WordPress自作テーマ開発】固定ページを自動作成する方法(下層ページ実装) 2025年3月18日
  • 【PHP】プロトコル / ラッパーについて(file:// php:// http:// https://) 2025年3月17日
  • 【PHP】stdClass を使用して(object) でキャスト 2025年3月16日
  • モダンなPHPコードで使用!無名関数の使い方 2025年3月15日
  • Cursor 便利な機能まとめ、Project Rules 2025年3月15日
  • PHP セッション名の変更方法と php.ini の記述方法まとめ 2025年3月12日
  • 【PHP】関数内でグローバル変数を使用するためには global キーワード 2025年3月10日
  • 【php8上級/準上級試験】模擬問題解説 問題30 strtotime() 2025年3月4日
  • 【php8上級/準上級試験】模擬問題解説 問題29 openssl_encrypt() openssl_decrypt() 2025年3月4日
  • 【php8上級/準上級試験】模擬問題解説 問題28 function_exists() 2025年3月4日
  • 【php8上級/準上級試験】模擬問題解説 問題27 Phar __HALT_COMPILER() 2025年3月4日
  • 【php8上級/準上級試験】模擬問題解説 問題26 htmlspecialchars() htmlentities() strpos() 2025年3月3日
  • 「HTTPセキュリティヘッダー」とは?個人情報扱うサイト、企業サイトは必須の設定! 2025年3月3日
About Us

Ready To Start Work With Us?

Felis consequat magnis est fames sagittis ultrices placerat sodales porttitor quisque.

Get a Quote
recent posts
  • さくらインターネットからWHOIS登録メールアドレスの利用廃止のメールが来た
  • スムーズにスクロールする処理をjQueryで実装
  • Google Workspace Labsとは始め方
  • Google Cloud の始め方
  • 【PHP】switch分の書き方、PHP 7.3 から PHP7.4の変更点
  • 【PHP】新しい方の指定方法「nullable」
  • 「PHPでJSONを扱う」json_encodeとjson_decode完全ガイド
  • 【WordPress自作テーマ開発】固定ページを自動作成する方法(下層ページ実装)
Opening Hours
Week Days 10:00 - 17:00
Saturday 10:00 - 15:00
Sunday Day Off
Contact us
popular posts
  • WordPressで画像を拡大表示するなら「Firelight Lightbox」(旧名:Easy Fancybox) 1k件のビュー
  • 【WordPress】カスタムフィールド作成の仕方「ACF」Advanced Custom Fieldsの使用法 700件のビュー
  • 【チートシート】Linuc Lv1-102 実務での使用例も解説 517件のビュー
  • My-Snow-Monkey使用例、子テーマによるカスタマイズ 495件のビュー
  • Twitter、Facebookのタイムラインを埋め込む 408件のビュー
  • 【WordPressエラー】「Warning: Undefined variable $post in …」「Warning: Attempt to read property “ID” on null in …」 400件のビュー
  • 【Next.js】ライブラリ使わないでカルーセルスライダー 251件のビュー
  • AWS認定ソリューションアーキテクト-アソシエイトレベル 248件のビュー
  • WordPress自作、カスタマイズ 228件のビュー
  • All-in-One WP Migration 192件のビュー
Search
Copyright © 2025 ntorelabo | Powered by Desert Themes