Day 0・Laravelを読むための最低限PHP
モダンPHP — 型宣言・null・例外・interfaceとtrait
引数と戻り値の型宣言、null許容 ?string、null合体 ??、nullsafe ?->、例外の try/catch/throw、interfaceとtraitのさわりを理解する。
型宣言 — 引数と戻り値に「型」を書く
このレッスンは仕上げの準備運動です。レッスン1で型(string/int など)を学びました。現代のPHPでは、関数の引数や戻り値に「この型のはず」という宣言を書けます。引数名の前に型を、戻り値はかっこの後にコロン「:」を付けて書きます。こうしておくと、違う型の値が来たときに早い段階で気づけます。
<?php
// 引数 $x は int(整数)、戻り値は string(文字列)と宣言
function label(int $x): string
{
return "番号:" . $x;
}
echo label(5); // → 番号:5なぜ型を書くのか
型を書くと「この関数は数値を受け取り、文字列を返す」という契約がコード上に明示されます。読む人にとっては仕様書代わりになり、間違った型を渡したときにはエラーで早く気づけます。Laravelのメソッドは引数・戻り値に型が付いていることが多く、型を読めると『この関数が何を受け取り何を返すか』が一目で分かります。
null 許容「?」・null 合体「??」・nullsafe「?->」
レッスン1で「値が無い」を表す null を学びました。型の前にクエスチョン「?」を付けると「その型、または null のどちらでもよい」(null許容)になります。たとえば「?string」は「文字列 または null」。「??」(null合体演算子)は「左が null ならこっちを使う」という書き方で、たとえば「$name ?? "ゲスト"」は「$name が null ならゲストを使う」という意味です。さらに「?->」(nullsafe演算子)を使うと、対象が null のときはメソッドを呼ばず、まるごと null を返してくれるので、null に対して「->」を使ったときのエラーで落ちずに済みます。
<?php
// ?string = 「文字列 または null」を受け取れる
function greet(?string $name): string
{
// $name が null なら "ゲスト" を使う(?? = null合体)
$display = $name ?? "ゲスト";
return "ようこそ $display さん";
}
echo greet("田中"); // → ようこそ 田中 さん
echo greet(null); // → ようこそ ゲスト さん-> だけだと null でエラー
<?php
$user = findUser(); // 見つからないと null が返るとする
// $user が null だとここでエラーで停止する
echo $user->name;?-> なら null でも落ちない
<?php
$user = findUser();
// $user が null なら、name を触らず全体が null になる
echo $user?->name ?? "未登録";例外 — try / catch / throw
<?php
// 処理の途中で「続行できない」異常が起きたら、例外(れいがい)で知らせる。
// throw で投げ、try で囲んだ範囲の例外を catch が受け止める。
function divide(int $a, int $b): int
{
if ($b === 0) {
// 異常事態を例外として投げる
throw new \InvalidArgumentException("0では割れません");
}
// intdiv は整数どうしの割り算で int を返す(/ は float を返すため型宣言と衝突する)
return intdiv($a, $b);
}
try {
echo divide(10, 0); // ここで例外が投げられる
} catch (\InvalidArgumentException $e) {
// 投げられた例外を受け止めて対応
echo "エラー: " . $e->getMessage(); // → エラー: 0では割れません
}- interface と trait のさわり(Laravelで多用される2つの言葉。今は概要だけでOK):
- interface(インターフェース):「このメソッドを必ず持っていること」という約束(契約)だけを定めたもの。中身は書かず、名前と形だけを決め、実装は各クラスに任せる。今は「そういうものがある」で十分。
- trait(トレイト):複数のクラスで使い回したいメソッドのまとまり。クラスに use で取り込むと、その機能を「混ぜ込む」ことができる。
なぜLaravelで多用されるのか
interfaceは「約束の形」だけを決めるので、中身を後から差し替えても呼び出す側は変えずに済みます。これがLaravelの による (依存性の注入)を支えます。traitは、多くのモデルで共通する機能(例: 論理削除など)を1か所にまとめて各クラスに混ぜ込むために使われます。どちらも「重複を避け、柔軟に組み替える」ための道具です。
Laravelではこう出てくる
Laravelのモデルは、型宣言・trait・戻り値の型が一度に出てきます。下の HasFactory は trait、: string は戻り値の型宣言、?-> と ?? もそのまま登場します。今日の知識を総動員すると、この短いクラスがぐっと読みやすくなります。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasFactory; // trait を混ぜ込む
// 戻り値は string と宣言。?-> と ?? で安全に呼び名を作る
public function displayName(): string
{
return $this->profile?->nickname ?? $this->name;
}
}読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
「$name ?? "ゲスト"」の意味として正しいものはどれか。
「?->」(nullsafe演算子)の説明として正しいものはどれか。
例外(try / catch / throw)の仕組みが何のためにあるのか説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。