Day 0・Laravelを読むための最低限PHP
名前空間とuse — App\Http\Controllers を読む
namespaceでクラスを整理し、useでインポートする仕組み。1ファイル1クラスの慣習とComposerによるオートロードを理解する。
名前空間(namespace)は「クラスの住所」
大きなアプリになると、クラスの数は何百にもなります。すると「User」という同じ名前のクラスを別の目的で作りたいことも出てきます。そこで、クラスに「住所(所属)」を付けて区別する仕組みが名前空間(namespace)です。フォルダで書類を整理するのと同じ発想で、名前空間はバックスラッシュ「\」で階層を区切ります。
<?php
// このファイルのクラスは App\Models という名前空間に属する、と宣言
namespace App\Models;
class User
{
// ...
}
// このクラスの「フルネーム(完全修飾名)」は App\Models\User になるなぜ名前空間が要るのか
名前空間がないと、アプリ全体でクラス名が1つでも重複した瞬間に衝突してエラーになります。名前空間で「住所」を分けておけば、App\Models\User と App\Admin\User のように、同じ User という名前でも別物として共存できます。大規模なLaravelアプリが破綻せず整理される土台がこれです。
use — 別の名前空間のクラスを呼び込む
別の名前空間にあるクラスを使いたいとき、毎回「App\Models\User」とフルネームで書くのは大変です。そこでファイル冒頭に「use App\Models\User;」と1行書いておくと、そのファイルの中では短く「User」と書くだけで使えるようになります。これを「インポート(取り込み)」と呼びます。
<?php
namespace App\Http\Controllers;
use App\Models\User; // User クラスをこのファイルに取り込む
class UserController
{
public function show()
{
// use のおかげでフルネームでなく User と短く書ける
return User::all();
}
}1ファイル1クラス と オートロード
PHPの現代的な慣習では「1つのファイルに1つのクラスを書き、ファイル名をクラス名に合わせる」ことになっています(例: User クラスは User.php)。そして、名前空間とフォルダ構成を対応させておくと、クラスを使った瞬間に対応するファイルを自動で読み込んでくれます。これを「オートロード」と呼びます。
このオートロードを担うのが です。Composerは、名前空間「App\」がフォルダ「app/」に対応する、といったルールを管理しており、あなたが手動で require(ファイルの読み込み命令)を書かなくても、必要なクラスを自動で見つけて読み込んでくれます。
なぜオートロードがありがたいのか
オートロードが無かった時代は、クラスを使うたびに「このファイルを読み込む」という require 文を人間が手で書いていました。数百クラスあると管理は地獄です。名前空間とフォルダを対応させ、Composerに任せることで、この面倒が完全に消えます。だからLaravelのファイルには require がほとんど出てきません。
Laravelではこう出てくる
Laravelのコントローラは必ず名前空間の宣言と use から始まります。ファイルのパス app/Http/Controllers/UserController.php が、名前空間 App\Http\Controllers\UserController にそのまま対応しているのが分かります。今日の知識で、この冒頭数行の意味が読めます。
<?php
namespace App\Http\Controllers; // フォルダ app/Http/Controllers に対応
use App\Models\User; // 使うクラスを取り込む
use Illuminate\Http\Request; // Laravel本体のクラスを取り込む
class UserController extends Controller
{
public function index()
{
return User::all(); // Composerが App\Models\User を自動読込
}
}読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
ファイル冒頭の「use App\Models\User;」は何のための行か。
Laravelのファイルに require(手動の読み込み命令)がほとんど出てこないのはなぜか。
「App\Http\Controllers\UserController」という表記が何を意味するか、名前空間の観点から説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。