この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:guest
更新日時:2026-06-11 07:10:02

タイトル: クラスとインスタンス
SEOタイトル: クラスとインスタンス完全ガイド (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 (依存性注入) でインスタンス渡しが推奨です。