LLaravel Bootcamp

Day 0Laravelを読むための最低限PHP

クラスとオブジェクト — -> と :: の違い

クラス・オブジェクト・new・プロパティ・メソッド・$this・コンストラクタ・可視性・static・定数、そして初心者最大の壁「->」と「::」の違いを理解する。

クラスは「設計図」、オブジェクトは「その実物」

クラスとは「こういうデータと、こういう動作を持ったものを作る」という設計図です。そして、その設計図から実際に作り出した実物を「オブジェクト」または「インスタンス」と呼びます。たい焼きで例えるなら、金型がクラス、そこから焼き上がった1つ1つのたい焼きがオブジェクトです。設計図(クラス)は1つでも、実物(オブジェクト)はいくつも作れます。オブジェクトが持つ「データ」を「プロパティ」、「動作」を「メソッド」と呼びます。プロパティは変数、メソッドは関数の、クラスの中版だと考えてください。

PHP
<?php

class User
{
    public $name; // プロパティ(このオブジェクトが持つデータ)

    // メソッド(このオブジェクトができる動作)
    public function hello()
    {
        // $this は「このオブジェクト自身」を指す
        return "こんにちは " . $this->name . " さん";
    }
}

// new でクラス(設計図)から実物(オブジェクト)を作る
$user = new User();
$user->name = "田中";     // -> でプロパティに値を入れる
echo $user->hello();       // -> でメソッドを呼ぶ → こんにちは 田中 さん
クラス定義と new。$this は「自分自身」、-> でプロパティやメソッドにアクセスする。

なぜ $this が要るのか

メソッドの中から「このオブジェクト自身が持つプロパティ」を触りたいとき、単に $name と書くと「メソッド内のただの変数」と区別がつきません。$this->name と書くことで「今処理している、このオブジェクト自身の name プロパティ」だと明確に指し示せます。$this は「自分自身」を指す合言葉だと覚えてください。

コンストラクタ __construct — 生まれた瞬間の初期設定

PHP
<?php

// new した瞬間に自動で1回だけ呼ばれる特別なメソッドが「コンストラクタ」。
// 名前は必ず __construct(アンダースコア2つ)。作られたと同時に初期値をセットする。
class User
{
    public $name;

    // new User("田中") とした瞬間に自動で呼ばれる
    public function __construct($name)
    {
        $this->name = $name; // 受け取った値を自分のプロパティに保存
    }
}

$user = new User("田中"); // ここで __construct が動く
echo $user->name;          // → 田中
コンストラクタは new と同時に自動実行され、初期値をセットする。可視性(public/private/protected)は次のセクションで扱う。

可視性(public / private / protected)

  • public(公開):クラスの外からでも自由に触れる
  • private(非公開):そのクラスの中からしか触れない。外に見せたくない内部データに使う
  • protected(限定公開):そのクラス自身と、それを受け継いだクラス(継承先)からだけ触れる

最大の壁:「->」と「::」の違い

PHP初心者が最もつまずくのがこの2つの矢印です。結論から言うと、対象が「new して作った実物(オブジェクト)」か「クラスそのもの」かで使い分けます。「->」(アロー)は new で作った実物のプロパティやメソッドに使い(例: $user->name)、「::」(ダブルコロン、スコープ解決演算子)はクラスそのものに属する static メンバーや定数に使います(例: User::create()、User::MAX_AGE)。ここで「static(静的)」とは、実物を作らなくても「クラスそのものに属する」共有のメンバーのことで、「const」で定義する定数と同じく new せずに「::」で使えます。

「->」実物(オブジェクト)に対して使う

PHP
<?php
$user = new User("田中"); // まず new で実物を作る
echo $user->name;          // 実物のプロパティ
echo $user->hello();       // 実物のメソッド
// $obj->method() = 「作った実物に対して」呼ぶ

「::」クラスそのものに対して使う

PHP
<?php
echo User::MAX_AGE;   // クラスの定数(new 不要)
$user = User::create(); // クラスの static メソッド(new 不要)
// Class::method() = 「クラスに対して直接」呼ぶ

覚え方のコツ

「実物(オブジェクト)を作ってから触るなら ->」「実物を作らずクラスに直接触るなら ::」と覚えてください。$小文字の変数の後ろは大体「->」、先頭大文字のクラス名の後ろは大体「::」という見た目の目印も、最初のうちは役に立ちます。

Laravelではこう出てくる

Laravelのコードは「->」と「::」だらけです。下の例で両方の使い分けを見てください。Route や User(モデル)のように「クラス名::」で始まるものと、$user のように「実物->」で続くものが混在します。今日の区別ができれば、この行が読めます。

PHP
<?php

// User はクラス。:: でクラスに直接メソッドを呼び、1件取得する
$user = User::find(1);

// $user は取得できた「実物」。-> でプロパティやメソッドにアクセス
echo $user->name;
$user->save();

// Route もクラス。:: で get メソッドを呼ぶ
Route::get("/users", function () {
    return User::all(); // User クラスに :: で all を呼ぶ
});
「クラス名::」と「実物->」が混在するLaravelの典型例。区別の目印は、先頭が大文字のクラス名か、$付きの変数か。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

「$user->name」と「User::MAX_AGE」の違いとして正しいものはどれか。

Q2

オブジェクトを new した瞬間に自動で1回だけ呼ばれ、初期値をセットするのに使う特別なメソッドはどれか。

Q3

メソッドの中で使う「$this」とは何を指すか、なぜ必要かを説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。