🔰

【初心者】PHPのクラスが何も分からない人へ ~クラスの処理を追ってみた~

に公開

こんにちは!Social Databank Advent Calendar 2025 の 7 日目です 🎄

PHP マスターのみなさん!さようなら!

PHP 初学者のみなさん!こんにちは!

この記事は PHP のクラスについて、ほんっっとうに右も左もわからない状態の人に向けた内容になっております 🔥
自分は文系出身かつエンジニア歴 2 年目のペーペーで、これまでずっとクラスという存在があやふやなままコードリーディングしている期間が長かったです。同じような段階にいる方たちにとって、少しでもイメージを掴む一助になればと自分の理解を書き起こしてみました。

今回はお菓子のキャンディを題材に、Candy クラスを書いていきます 🍬🍭

class クラスとは

クラス とは、設計書のような存在です。
この設計書には様々な情報が載っています。

この設計書という存在に対し、設計書をもとに実際に作ってみたものインスタンス(オブジェクト) と呼びます。設計書をもとに実際に作ることを インスタンス化(オブジェクト化)する といいます。

クラスとインスタンスは別物です。キャンディの設計書と、出来あがったキャンディそのものは別の存在です。

🔰🔰 設計書は「レシピ」くらいにとらえると分かりやすいかもしれません。キャンディの作り方や必要な材料、そのレシピで作ったキャンディで作れるキャンディケーキの情報などが載っているイメージです 🍭

CandyClass.php
class Candy
{
    // 書いていくぞ〜!
}

1. property プロパティを定義

まずは、この設計書で作りたいものの基本情報をpropertyとして定義・管理します。👇

CandyClass.php
class Candy
{
    private string $flavor;     // そのキャンディの味
    private bool $hasSugar;     // そのキャンディに砂糖が入っているかどうか
    private int $calorie;       // そのキャンディのカロリー
}

private(=アクセス修飾子(後述)) + データ型 + その property 情報を入れる変数名 と書きます。

🔰🔰 プロパティはクラスの中でも先頭の方に書いてあります!

基本情報を入れておく を定義しておくイメージです。

出来上がったキャンディの、何味なのか?砂糖入りなのか?どれくらいのカロリーがあるのか?の情報を使ってみたいので、この 3 枠を定義してみました。

ここで定義した プロパティ は、このクラス内において $this->変数名 でアクセスする・情報を見にいくことができます。← 直後のコンストラクタで使います!

🔰🔰 $thisは、文字通り「この」って意味です。「この設計書から生み出した(インスタンス化した)実際のやつの」という置き換え方が一番自然に感じます

2. __construct() コンストラクタを定義

プロパティを定義できたら、__construct()という特別なメソッドを定義します。
ここでは、「設計書から作り出すときに、外から渡す '実際に作りたいものの情報' はさっき作った 'プロパティの枠' に入れて管理してね!」という情報の道筋を指定しています。

基本情報の枠だけいったん用意してある状態なので、次はそこに、作りたいキャンディの情報(イチゴ味とか、砂糖入りとか、何カロリーかとか)を実際に作る時に外から渡してあげるルートを用意する必要があるというわけです。👇

CandyClass.php
class Candy
{
    private string $flavor;     // そのキャンディの味
    private bool $hasSugar;     // そのキャンディに砂糖が入っているかどうか
    private int $calorie;       // そのキャンディのカロリー

    public function __construct(string $flavor, bool $hasSugar, int $calorie)
    {
        $this->flavor = $flavor;
        $this->hasSugar = $hasSugar;
        $this->calorie = $calorie;
    }
}

急に訳分からなくなりますね…… flavor = $flavor ってなんやねんという感じです笑
定義したプロパティの枠($this->flavor)と、__construct()の引数として受け取った実際の情報($flavor)を紐付けています。👇

コンストラクタ

🔰🔰 $this->flavorとイコールの右辺の$flavorは別物なのです。ここで、引数として受け取る変数名はプロパティ名と同じでなくても全然問題ないのですが、どうせ同じ意味を持つものだから、と同じ変数名で書かれていることが多いです。どれが何か分からなくて困った……

繰り返しになりますが、今書いているクラスとはあくまでも 設計書 です。情報をどのように受け取り、どう管理するかの流れを書いてあげています。

さて、ここで受け取った実際の情報をクラス内で使うためにプロパティに入れる流れができたので、今後クラス内でこの情報を使いたい時はプロパティの方を呼び出せばいいという状態になりました。呼び出し方は、先ほどから登場している $this->(プロパティ名)です!

3. new インスタンス化する

では早速、設計書をもとに実際にキャンディを作ってみましょう!
newと先頭に書くことで、Candy というクラスをもとに実際のものを作ってね(インスタンス化してね)という指示ができます。
__construct()で引数の受け取りを定義した基本情報をここで渡す必要があります。

MakeCandy.php
// __construct()で定義した順に $flavor, $hasSugar, $calorie の情報を渡す
new Candy('strawberry', true, 100);

🔰🔰 今回はクラスを定義したCandyClass.phpファイルとは別のMakeCandy.phpファイルでキャンディをインスタンス化していきます 🍬 もちろん同一ファイルでクラスの下に new と書いていくこともできますが、クラスの定義とインスタンス化は別の処理です。

イチゴ味で、砂糖入りの、100 キロカロリーのキャンディを生成してみました。ここで渡した引数がクラスという設計書の__construct()メソッドで受け取られ、プロパティの枠の中におさまる訳です。

出来上がったもの = インスタンス は、分かりやすいように変数に入れておきたいので以下のように書き加えました。

MakeCandy.php
$strawberryCandy = new Candy('strawberry', true, 100);

クラスはあくまでも設計書なので、これをもとに何度でも同じ基本情報を持つキャンディを作ることができます。

MakeCandy.php
$lemonCandy = new Candy('lemon', false, 50);
$vanillaCandy = new Candy('vanilla', true, 220);
$bananaCandy = new Candy( ...
...

⭐️ アクセス修飾子 private, public

さて、いくつかキャンディを作りました。
ここで、同じクラスから作った$bananaCandyに注目します。この$bananaCandyは何カロリーなんでしょうか?基本情報として定義してあるはずなので、プロパティにアクセスすればわかりそうです。
クラス内で$this->(プロパティ名)と書いていた時のように、インスタンスから直接アロー演算子 ->でアクセスしてみます。👇

MakeCandy.php
$bananaCandy->calorie; // 💥💥エラー: メンバーの可視性は private です

あれ、エラーになりました、、これは、Candy クラスのプロパティを定義した際に privateのアクセス修飾子をつけているためです。

クラス内で定義するプロパティやメソッドには、先頭にアクセス修飾子というものをつけます。

private → このクラス内からしかアクセスできません 🔐
public → このクラスの外からでもアクセスできます 🪟

🔰🔰 protectedという修飾子については、クラスの継承という概念を知るといきてくるものだと思うので本記事では割愛します 🙇‍♀️

プロパティは、基本的には外からむやみに変更を受けたくないので、private で定義する場合がほとんどです。

ということで、直接見ようとしたら弾かれてしまいました……。これは安全な仕組みなんですね。
では、外から変更できないよう定義自体はprivateにしたままで値は取得したい!という望みを叶えるため、publicなメソッドを定義します。

🔰🔰 コンストラクタもpublicで定義されたメソッドですね。ここがprivateだと外からアクセスできず引数として情報を受け取るなどの処理ができなくなり、インスタンス化ができません汗

4. getter/setter メソッドを定義

CandyClass.php
class Candy
{
    private string $flavor;     // そのキャンディの味
    private bool $hasSugar;     // そのキャンディに砂糖が入っているかどうか
    private int $calorie;       // そのキャンディのカロリー

    public function __construct(string $flavor, bool $hasSugar, int $calorie)
    {
        $this->flavor = $flavor;
        $this->hasSugar = $hasSugar;
        $this->calorie = $calorie;
    }

    public function getCalorie(): int
    {
        return $this->calorie;
    }
}

これまで書いてきた class Candyの下部にpublicgetCalorie()というメソッドを追加してみました。
記述の通り、これは $this->calorieの中身をreturnするだけのメソッドです。返り値の型は$this->calorieの型であるintを指定しています。
プロパティはprivateで定義してありますが、クラス内からはアクセスできるので、ここのメソッド内では呼び出すことができるんですね。

これにより、最初に渡されてきた$calorieの値を保持している$this->calorieの情報に外からアクセスできるようになりました。👇

MakeCandy.php
$bananaCandy->getCalorie(); // 400    高っ!!

プロパティの情報を取得するメソッドはgetXXX()と命名する慣例があります。これを getter と呼びます。

他のプロパティ用の getter メソッドも定義しておきましょう。👇

CandyClass.php
class Candy
{
    private string $flavor;     // そのキャンディの味
    private bool $hasSugar;     // そのキャンディに砂糖が入っているかどうか
    private int $calorie;       // そのキャンディのカロリー

    public function __construct(string $flavor, bool $hasSugar, int $calorie)
    {
        $this->flavor = $flavor;
        $this->hasSugar = $hasSugar;
        $this->calorie = $calorie;
    }

    public function getFlavor(): string
    {
        return $this->flavor;
    }

    public function getHasSugar(): bool
    {
        return $this->hasSugar;
    }

    public function getCalorie(): int
    {
        return $this->calorie;
    }
}

プロパティはアクセスして値を取得するだけでなく、新しく渡した値に変更することもできます。その場合はsetXXX()という名前でメソッドを定義することが多いです。これはsetterと呼びます。👇

CandyClass.php
class Candy
{
    private string $flavor;     // そのキャンディの味
    private bool $hasSugar;     // そのキャンディに砂糖が入っているかどうか
    private int $calorie;       // そのキャンディのカロリー

    public function __construct(string $flavor, bool $hasSugar, int $calorie)
    {
        $this->flavor = $flavor;
        $this->hasSugar = $hasSugar;
        $this->calorie = $calorie;
    }

    // 〜〜省略〜〜

    public function setCalorie(int $newCalorie): void
    {
        $this->calorie = $newCalorie;
    }
}

引数として渡された情報でプロパティの値を上から起き換えるというメソッドです。値の挿入だけを行うので今回は返り値は定義していません。👇

MakeCandy.php
$bananaCalorie->getCalolie();       // 400    さっき確認した通り
$bananaCalorie->setCalolie(200);    // ←⭐️ setterを発動!
$bananaCalorie->getCalolie();       // 200    setterに渡した値に変更されている

🔰🔰 getter と setter どちらも用意するなら、そのプロパティ自体privateである意味はないのでは?という感じですが、、ひとまず基本理解ということでご了承ください 🙏

5. 様々なメソッドを定義

クラスに定義できるメソッドは getter/setter だけではありません。なんでも定義できます。

今回のキャンディでいうと以下のようなメソッドが書けそうです。

  • この出来上がったキャンディがヘルシーかどうか知りたい
  • この出来上がったキャンディが砂糖抜きだった場合は砂糖入りにしたい
  • この出来上がったキャンディを 5 本食べたら何カロリーになるのか知りたい

もちろん、外から->で呼び出せるように、アクセス修飾子は publicで書きましょう。👇

CandyClass.php
class Candy
{
    private string $flavor;     // そのキャンディの味
    private bool $hasSugar;     // そのキャンディに砂糖が入っているかどうか
    private int $calorie;       // そのキャンディのカロリー

    public function __construct(string $flavor, bool $hasSugar, int $calorie)
    {
        $this->flavor = $flavor;
        $this->hasSugar = $hasSugar;
        $this->calorie = $calorie;
    }

    // 〜〜省略〜〜

    public function isHealthy(): bool
    {
        return $this->calorie < 80;
    }

    public function addSugar(): void
    {
        $this->hasSugar = true;
    }

    public function calculateCalories(int $pieces): int
    {
        return $this->calorie * $pieces;
    }

}

いずれも、getter/setter と同じように、インスタンス化した後にアロー演算子で呼び出せます。👇

MakeCandy.php
// $strawberryCandyはcalorieを100で生成したキャンディです。80以上なので高カロリー判定です……
$strawberryCandy->isHealthy();  // false

// $lemonCandyは砂糖なしで生成したレモンキャンディです
$lemonCandy;
$lemonCandy->addSugar();
// addSugar()したので、hasSugarの値がtrueに変わっています
$lemonCandy->getHasSugar();     // true

// $vanillaCandyはcalorieを220で生成しています
$vanillaCandy;
// 5本食べると1100、並のラーメンくらいあるようです汗
$vanillaCandy->calculateCalories(5);    // 1100

インスタンス化されたこのキャンディたちはまったくの別物であり、それぞれ繋がりはありません。$strawberryCandyのプロパティ情報が setter などで変わっても、$lemonCandyには何の影響もありません。あくまでもこの$strawberryCandyの情報が変わっただけだからです。
しかし、3 つとももとになっている設計書が同じなので、そこに書かれているメソッドは同じように使えるのです。

自分が詰まったポイント

今回書いてみたキャンディクラスはこんな感じになりました。長すぎるので閉じておきます。笑

CandyClass.php と MakeCandy.php
CandyClass.php
class Candy
{
    private string $flavor;     // そのキャンディの味
    private bool $hasSugar;     // そのキャンディに砂糖が入っているかどうか
    private int $calorie;       // そのキャンディのカロリー

    public function __construct(string $flavor, bool $hasSugar, int $calorie)
    {
        $this->flavor = $flavor;
        $this->hasSugar = $hasSugar;
        $this->calorie = $calorie;
    }

    // getter

    public function getFlavor(): string
    {
        return $this->flavor;
    }

    public function getHasSugar(): bool
    {
        return $this->hasSugar;
    }

    public function getCalorie(): int
    {
        return $this->calorie;
    }

    // setter

    public function setCalorie(int $newCalorie): void
    {
        $this->calorie = $newCalorie;
    }

    // そのほかのメソッド

    public function isHealthy(): bool
    {
        return $this->calorie < 80;
    }

    public function addSugar(): void
    {
        $this->hasSugar = true;
    }

    public function calculateCalories(int $pieces): int
    {
        return $this->calorie * $pieces;
    }

}

MakeCandy.phpもまとめておきます。

MakeCandy.php

new Candy('strawberry', true, 100);


$lemonCandy = new Candy('lemon', false, 50);
$vanillaCandy = new Candy('vanilla', true, 220);
$bananaCandy = new Candy('banana', true, 400);

$bananaCandy->getCalorie();     // 400

$bananaCalorie->getCalolie();   // 400
$bananaCalorie->setCalolie(200);
$bananaCalorie->getCalolie();   // 200

$strawberryCandy->isHealthy();  // false

$lemonCandy->addSugar();
$lemonCandy->getHasSugar();     // true

$vanillaCandy->calculateCalories(5);    // 1100

自分が初めてクラスまわりのコードを読んでいた頃ずっと理解できなかったのが、インスタンス化する際に引数として何を渡さなくてはいけないのか?という点でした。

new Class($param)   // この$paramはどこに吸われている?何のための引数?

__construct()の存在としくみを大まかに理解してから、少しクラスへの恐怖心が減りました。

この記事のどこかの部分がクラスという壁にぶち当たっている誰かのお役に立てば幸いです!
お読みいただきありがとうございました 🙏

ソーシャルデータバンク テックブログ

Discussion