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

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

今回は定義済の変数に関する問題です。PHPには $GLOBALS や $_SERVER、$_COOKIE など、スクリプト全体からアクセスできる定義済のスーパーグローバル変数があります。それぞれの用途や制限を正しく理解しておきましょう。
PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/
問題文
定義済の変数 に関する説明の中で、誤っているものを1つ選びなさい。
なお、すべてのコードの先頭には下記のコードが書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
(1)
$_SERVER は、ヘッダ、パス、スクリプトの位置のような 情報を有する配列である。
この配列のエントリは Web サーバーにより生成されるため、PHP をコマンドラインで実行している場合には、使用できないものもある。
そのため、以下のコード
var_dump( $_SERVER['REMOTE_ADDR'] );
を Web サーバ経由で実行した場合は現在ページをみているユーザーの IP アドレスが出力されるが、コマンドラインから実行した場合は次のような結果となる。
Warning: Undefined array key "REMOTE_ADDR" in …
NULL
(2)
$GLOBALS はグローバルスコープで使用可能なすべての変数への参照である。変数名が配列のキーとなる。そのため、以下のコード
function hoge() {
var_dump( $GLOBALS['i'] );
}
$i = 999;
hoge();
は正しく実行でき、結果は次のとおりとなる。
int(999)
(3)
$argv はスクリプトに渡された引数の配列である。
$argv[0] はスクリプトの実行に使う名前となり、$argv[1] 以降に引数の配列が入る。そのため、
var_dump( $argv[1], $argv[2] );
上記のコードを
php sample.php aaa "bb cc dd" 999
のように呼び出すと、結果は次のとおりとなる。
string(3) "aaa"
string(8) "bb cc dd"
(4)
$_COOKIE は現在のスクリプトに HTTP クッキーから渡された変数の連想配列である。
Cookie から渡された値は $_COOKIE に入り、また $_COOKIE に設定した値は Cookie として設定される。そのため、以下のコード
$_COOKIE['i'] = ($_COOKIE['i'] ?? 0) + 1;
var_dump($_COOKIE['i']);
をブラウザから呼び出すと、1回目の結果は次のとおりとなる。
int(1)
2回目の結果は次のとおりとなる。
int(2)
3回目の結果は次のとおりとなる。
int(3)
解説
選択肢1の解説
正しいです。
$_SERVER は、サーバーや実行中のスクリプトに関する情報を持つ「スーパーグローバル変数」 です。PHPには、どこからでもアクセスできる特別な変数(配列)がいくつかあります。$_GET, $_POST, $_SESSION, $_SERVER などがあり、$_SERVER には サーバー情報 や 現在のスクリプトに関するデータ が格納されています。
REMOTE_ADDR は「Webサーバーがリクエストを受けたときのクライアントのIP」を示すため、CLI環境(コマンドライン)からは利用できません。
選択肢2の解説
正しいです。
$GLOBALS は、すべてのグローバル変数にアクセスできる特別な配列(スーパーグローバル変数) です。通常、関数の中から グローバル変数には直接アクセスできませんが、$GLOBALS を使うと、関数内からでもグローバル変数を操作できる ようになります。
PHPには、どこからでもアクセスできる特別な変数(配列)があります。$_GET、$_POST、$_SERVER、$GLOBALS などがあり、$GLOBALS は グローバルスコープのすべての変数を格納する連想配列 です。
GLOBALS[‘変数名’] という書き方で、関数の中からグローバル変数にアクセスできます。
(1~3行目)$GLOBALS[‘i’]を表示する関数hoge()を定義しています。ここでグローバル変数 $i にアクセスし、値を表示します。
(5行目)$i = 999; で変数 $i に 999 を代入します。通常、スコープの問題で関数の中から $i に直接アクセスできません。
(6行目)hoge() を実行します。hoge() 内で $GLOBALS[‘i’] を参照し、グローバル変数 $i の値を出力します。
選択肢3の解説
正しいです。
$argv は、スクリプトに渡されたコマンドライン引数を格納する配列であり、$argv[0] はスクリプト名、$argv[1] 以降が引数となります。指定されたコードも正しい結果を返します。
選択肢4の解説
誤っています。
$_COOKIE に代入しても、ブラウザに即座に反映されるわけではなく、クッキーを設定するには setcookie() 関数を使う必要があります。
正解選択肢
以上より選択肢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
コメント