はじめに
アドベントカレンダー12/11、11記事目になります。
今回は、Laravel を学習している途中で遭遇した「Undefined variable」に関するエラーについて、原因と対処方法をまとめてみました
PHPでは 「グローバル変数」「スーパーグローバル変数」 など、似た名称の概念がいくつか登場します。エラー内容と一緒に整理していきます。
環境など
- 自身:Laravel初学者
- 使用パソコン:MacBook
- Laravelバージョン:確か7
エラー内容
実際に発生したエラーはこちらです。
Warning: Undefined variable
$_server in /var/www/tr_php/02/create_user.php
on line 22 Warning:
Trying to access array offset on value of type null
in /var/www/tr_php/02/create_user.php on line 22
「Undefined variable(未定義の変数)」 と言われています。
つまり、PHPが「その変数、そもそも存在しませんよ」と怒っています。
グローバル変数とスーパーグローバル変数について
まず前提として、PHPでは2種類の性質の変数が登場します。
■ グローバル変数
-
自分で定義する変数
-
関数内から使うには global キーワードが必要
(例)global $foo; -
ファイル内でのスコープ(見える範囲)が制限される
■ スーパーグローバル変数
- PHPに最初から組み込まれている特別な変数
- 関数内外どこでも使える
- 代表例
$_GET
$_POST
$_SESSION
$_COOKIE
$_SERVER← 今回の主役!
これらはすべて 大文字で書く 決まりがあります。
今回のエラーの原因
今回のコードを改めて見てみると……
修正前
if ($_server['request_method'] === 'post') {
ここで使っている変数名が $_server(全部小文字) になっているので、 大文字 に変えることがエラー解決に!
修正版コード
修正後
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
このように、変数名の大小文字を修正することでエラーが解消されます。
なぜ $_SERVER['REQUEST_METHOD'] を使うのか?
$_SERVER は、PHPが自動的に用意してくれる「サーバーやリクエストの情報のまとめ」です。
| キー名 | 意味 |
|---|---|
REQUEST_METHOD |
POST / GET / PUT など、HTTPメソッド |
REQUEST_URI |
アクセスされたパス |
HTTP_USER_AGENT |
ブラウザ情報 |
今回使った REQUEST_METHOD は
「フォームが POST で送信されたかどうか」 を判定したいときに使います。
コード解説
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
これは、
- もしリクエストメソッドが POST なら
- この中の処理を実行する
という意味で、フォーム送信でよく使われる基本構文です。
さいごに
今回のエラーは、$_SERVER を 小文字で書いてしまった ことが原因でした。
スーパーグローバル変数は「スーパー」と付くだけあって、PHPのどこからでも使える便利な変数です。
そのぶん、名前が正しいかどうか がとても重要になることをしりました。
スーパーグローバル変数の数自体は多くないので、
今回のようにトラブルに遭ったときに1つずつ覚えていくとで理解を深めていきたいと思いました。
「なぜこのエラーが起きたのか?」を考えるクセをつけてレベルアップしていきたいと思います
参考記事