【基礎知識】PHPのスーパーグローバル変数(PHP8技術者認定初級試験)

こんにちは、穂苅と申します。

このコラムでは、私が PHP8 技術者認定初級試験のための公式問題集(PHP8 技術者認定初級試験公式問題集)で学習した内容やポイントを取り上げて解説をしていくものです。P163〜172 のChapter 17 リクエスト情報のスーパーグローバル変数を学習してみました。

目次

PHPのスーパーグローバル変数とは?

まず、PHP 公式ドキュメントで「スーパーグローバル」を見てみます。

スーパーグローバル すべてのスコープで使用できる組み込みの変数—

PHP の定義済み変数の中には “スーパーグローバル” というものがあります。 これは、スクリプト全体を通してすべてのスコープで使用可能な変数のことです。 関数やメソッドの内部からアクセスする際にも global $variable; などとする必要はありません。

(参考: https://www.php.net/manual/ja/language.variables.superglobals.php

つまり、スーパーグローバル変数とはPHP であらかじめ定義されている変数の1 つで、プログラム内のどこからでも同じ変数にアクセスできるものをいいます。ちなみに変数にはローカル変数というのもあり、ローカル変数は関数の中で定義して関数の中だけ(ローカル)で使える変数ですのでかなり範囲が狭いものです。スーパーグローバル変数は、以下の9 種類があります。

$GLOBALS

$_SERVER

$_GET

$_POST

$_FILES

$_COOKIE

$_SESSION

$_REQUEST

$_ENV

例えば、$_POST 変数はHTTP のPOST リクエストで送信されてきたデータが格納されます。POST リクエストのデータはURL 内には含まれずに別の経路でサーバに送られます。以下のようなコードのフォームで、「テストマン」という情報を送信するとします。すると、「nickname=テストマン」というデータがPOST リクエストで、https://example.jp/save.php に送信され、save.php の中で、$_POST[‘nickname’] を見ると、「テストマン」というデータが格納されているということです。

また、$_GET 変数にはHTTP のGET リクエストで送られてきたデータが格納されます。POST と違って、GET リクエストのデータはURL に含まれます。例えば以下のような感じです。

form action=”save.php” method=”post”>
ニックネーム: <input type=”text” name=”nickname”>
<br>
<input type=”submit” name=”submit” value=”登録”>
</form>

https://example.jp/profile.php?nickname=テストマン

グローバル変数の注意点としては、「外部から入ってくるデータはすべて信用できない」と見なして検証することです。フォームから送信される情報はルール通りに入ってこないケースや悪意のあるデータ送信が行われる可能性もあります。そこで、PHP 側で情報が問題ないのかを確かめないといけません。検証前のデータを「生データ」と呼ぶようで、この「生データ」のまま扱うのは危険なため注意です。

(参考)https://www.php.net/manual/ja/language.variables.external.php

複数のリクエスト情報をまとめて扱う場合

次に、複数のリクエスト情報を扱う場合にどうするのかを考えてみます。例えば、以下の2 つのケースはどのようにデータが扱えるでしょうか。

1.https://example.jp?keywords[]=blue&keywords[]=sky

2.https://example.jp?keywords=blue,sky

まずルールを明確にすると、「複数のリクエストを設定したい場合は[]を使って配列にする」となります。つまり、1の場合は、最初の[]は0番、次の[]が1 番ですので、データを見てみると以下のようになります。

var_dump($_GET[‘keywords’]);
// [“keywords”]=>
// array(2) {
// [0]=>
// string(4) “blue”
// [1]=>
// string(3) “sky”
// }

しっかりと格納できています。

続いて2の方ですが、配列になっていないため後勝ちになります。つまり、$_GET[‘keyword’] === ‘sky’となり、blue のデータが消えてしまうので想定通りのデータ格納に出来ないことがわかりました。ちなみに、リクエスト情報を配列にすると情報の整理が出来て扱いやすくなるということなので、配列での整理は気をつけたいところです。

配列を使わずにまとめた場合

<?php
$input = $_GET[‘form’];
// [
// ‘user_name’ => ‘テスト一郎’,
// ‘user_age’ => ’35’,
// ‘settings_private’ => ‘off’,
// ‘settings_notification’ => ‘on’
// ];
$user->validte(
$input[‘user_name’],
$input[‘user_age’]
);
$settings->validate(
$input[‘settings_private’],
$input[‘settings_notification’]
);
?>

配列でまとめた場合

<?php
$input = $_GET[‘form’];
// [
// ‘user’ => [
// ‘name’ => ‘テスト一郎’,
// ‘age’ => ’35’ ‘settings’ => [
// ‘private’ => ‘off’,
// ‘notification’ => ‘on’
// ]
// ];
$user->validte($input[‘user’];
$settings->validate($input[‘settings’]);
?>

確かに配列でスッキリしていいですね。
その他、$_SESSION ではセッション管理ができますので、セッション ID をキーとして任意のデータを保存することができるものです。

PHP8技術者認定初級試験で、正しいPHPの理解を

今回は、スーパーグローバル変数について勉強してきました。スーパーグローバル変数というのがあること、POST やGET などはかなり使う機会が多いこと、しっかりと情報の検証をしないと危険性もあることなどが重要な点だと思いました。

次回以降もPHP で学習した内容をシェアしていきますので、よろしくお願いいたします。また、PHP の学習やエンジニアになるためのマイルストーンとして、PHP 試験はおすすめです。PHP8技術者認定初級試験はPHP を扱うあらゆる方にとって有益な試験になるはずですので、ご興味がある方はぜひチャレンジしてみてください。

試験ページ: PHP8 初級試験

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次