14.

クラスとインスタンス完全ガイド (Java/PHP/Python の new / コンストラクタ / static)

編集
この記事の要点
  • クラス = 設計図 (型・振る舞いの定義)、インスタンス = 設計図から作られた実体(オブジェクト)
  • インスタンス化は new ClassName(args)。コンストラクタが呼ばれ初期化処理が走る
  • static (クラス変数 / メソッド) はインスタンスを作らずクラス名で呼べる
  • this (PHP は $this) は "今のインスタンス" を指す参照
  • Singleton / Factory / Anonymous Class などのパターンで応用

クラスとインスタンスの関係

クラスは「車の設計図」、インスタンスは「設計図から実際に組み立てた個別の車」と例えられます。

用語役割例 (車)
クラス属性・振る舞いの定義「セダン車」の設計図
インスタンスクラスから生成された実体ナンバー 品川500あ12-34 の実車
フィールド (プロパティ)個別インスタンスが持つ値色 / 走行距離
メソッドインスタンスの振る舞い走る / 停まる
static (クラス変数)クラス全体で共有する値「メーカー名 = Toyota」

PHP でのクラスとインスタンス

class Car {
    // フィールド (インスタンス変数)
    public string $color;
    public int $mileage = 0;

    // クラス変数 (static)
    public static string $maker = 'Toyota';

    // コンストラクタ
    public function __construct(string $color) {
        $this->color = $color;
    }

    // インスタンスメソッド
    public function run(int $km): void {
        $this->mileage += $km;
    }

    // クラスメソッド (static)
    public static function getMaker(): string {
        return self::$maker;
    }
}

// インスタンス化
$car1 = new Car('red');
$car2 = new Car('blue');

$car1->run(100);
echo $car1->mileage;       // 100
echo $car2->mileage;       // 0 (独立)

// static アクセス
echo Car::$maker;          // Toyota
echo Car::getMaker();

Java でのクラスとインスタンス

public class Car {
    // フィールド
    private String color;
    private int mileage = 0;

    // static フィールド
    public static String MAKER = "Toyota";

    // コンストラクタ
    public Car(String color) {
        this.color = color;
    }

    // インスタンスメソッド
    public void run(int km) {
        this.mileage += km;
    }

    public int getMileage() { return mileage; }

    // static メソッド
    public static String getMaker() {
        return MAKER;
    }
}

// 利用
Car car1 = new Car("red");
Car car2 = new Car("blue");
car1.run(100);
System.out.println(car1.getMileage());   // 100
System.out.println(Car.MAKER);           // Toyota

Python での同等コード

class Car:
    maker = 'Toyota'           # クラス変数

    def __init__(self, color):
        self.color = color     # インスタンス変数
        self.mileage = 0

    def run(self, km):
        self.mileage += km

    @classmethod
    def get_maker(cls):
        return cls.maker

car1 = Car('red')
car2 = Car('blue')
car1.run(100)
print(car1.mileage)            # 100
print(Car.maker)               # Toyota

this / self の意味

class User {
    public string $name;

    public function __construct(string $name) {
        $this->name = $name;      // ← この時の $this はこれから作るインスタンス
    }

    public function hello(): string {
        return "I am {$this->name}";   // ← 呼び出し元インスタンス
    }
}

$a = new User('Taro');
$b = new User('Hanako');
echo $a->hello();    // I am Taro   ($this = $a)
echo $b->hello();    // I am Hanako ($this = $b)

Singleton パターン

あるクラスのインスタンスをプロセス内に 1 つだけ持つ設計:

class Config {
    private static ?Config $instance = null;
    private array $values = [];

    // private にして外部から new できないようにする
    private function __construct() {}

    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function get(string $key): mixed {
        return $this->values[$key] ?? null;
    }
}

$cfg = Config::getInstance();
$cfg2 = Config::getInstance();
var_dump($cfg === $cfg2);  // true (同じインスタンス)

Factory パターン

abstract class Animal {
    abstract public function speak(): string;
}

class Dog extends Animal {
    public function speak(): string { return 'Woof'; }
}
class Cat extends Animal {
    public function speak(): string { return 'Meow'; }
}

class AnimalFactory {
    public static function create(string $type): Animal {
        return match ($type) {
            'dog' => new Dog(),
            'cat' => new Cat(),
            default => throw new InvalidArgumentException("Unknown: $type"),
        };
    }
}

echo AnimalFactory::create('dog')->speak();   // Woof

無名クラス (Anonymous Class)

// PHP 7+ 無名クラス
interface Logger {
    public function log(string $msg): void;
}

function process(Logger $l): void {
    $l->log('done');
}

process(new class implements Logger {
    public function log(string $msg): void {
        echo "[LOG] $msg";
    }
});

// Java の無名クラス
Runnable r = new Runnable() {
    @Override
    public void run() { System.out.println("hi"); }
};
new Thread(r).start();

クラス vs インスタンスメンバの早見表

項目インスタンスメンバstatic メンバ
アクセス$obj->fieldClassName::$field
this 利用不可 (self / static のみ)
用途個別の状態クラス全体で共有 (定数 / カウンタ)
テスト容易性○ (DI 可能)× (グローバル状態)

FAQ

Q: クラスとオブジェクトと インスタンスは同じもの?
A: オブジェクト = インスタンスとほぼ同義です。クラス = 型、インスタンス = 実体。

Q: PHP で new を忘れたら?
A: $user = User::class; はクラス名文字列が入るだけ。$user->name しても Fatal error になります。

Q: static を多用してはいけない?
A: グローバル状態になりテストが困難になります。DI (依存性注入) でインスタンス渡しが推奨です。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 基本事項
  2. HTMLへの埋め込み
  3. 変数
  4. 可変変数
  5. 定数
  6. データ型
  7. キャスト
  8. エスケープ文字
  9. 配列
  10. 演算子
  11. 代入の際の注意点
  12. 条件分岐
  13. 繰り返し処理
  14. クラスとインスタンス
  15. コンストラクタ
  16. 関数
  17. スーパーグローバル変数
  18. スコープ
  19. staticについて
  20. yieldについて
  21. ファイルのアップロード方法
  22. DB接続方法
  23. SQL実行方法
  24. カプセル化の具体例
  25. 継承の構文
  26. オーバーライド
  27. ポリモーフィズム(多様性)の具体例
  28. 抽象クラス・メソッドの構文と具体例
  29. GET通信
  30. try catchで全てのエラーを拾う方法

最近更新/作成されたページ