0Pricing
PHP Academy · レッスン

静的プロパティとメソッド

staticメンバーを使い、インスタンスなしで呼び出すタイミングを理解します

「静的プロパティとメソッド」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

はじめに:静的プロパティとメソッド

静的メンバーは、個々のインスタンスではなくクラス自体に属します。クラスの外部からはClassName::memberで、クラスの内部からはself::でアクセスします。静的メンバーはすべてのインスタンス間で共有されます。

基本概念

静的プロパティとメソッドの重要な概念:

  • staticキーワードを使って宣言します
  • ::(スコープ解決演算子)でアクセスします
  • クラス内部ではself::、外部からはClassName::を使用します
  • static::で遅延静的束縛を行います

静的プロパティ

例:

<?php
class AppConfig {
    private static array $settings = [];

    public static function set(string $key, mixed $val): void {
        self::$settings[$key] = $val;
    }

    public static function get(string $key, mixed $default = null): mixed {
        return self::$settings[$key] ?? $default;
    }
}

AppConfig::set('debug', true);
echo AppConfig::get('debug') ? 'debug on' : 'debug off';

静的メソッド

続き:

<?php
class MathHelper {
    public static function clamp(float $v, float $min, float $max): float {
        return max($min, min($max, $v));
    }

    public static function lerp(float $a, float $b, float $t): float {
        return $a + ($b - $a) * $t;
    }
}

echo MathHelper::clamp(150, 0, 100); // 100
echo MathHelper::lerp(0, 100, 0.5);  // 50

シングルトンパターン

練習:

<?php
class Database {
    private static ?Database $instance = null;

    private function __construct() {
        echo 'Connected to DB';
    }

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

$db1 = Database::getInstance();  // 'Connected to DB'
$db2 = Database::getInstance();  // no output — same instance
echo ($db1 === $db2) ? 'same' : 'different'; // same

静的カウンター

さらに詳しく:

<?php
class EventEmitter {
    private static int $instanceCount = 0;

    public function __construct() {
        self::$instanceCount++;
    }

    public static function count(): int {
        return self::$instanceCount;
    }
}

new EventEmitter();
new EventEmitter();
new EventEmitter();
echo EventEmitter::count();  // 3

遅延静的束縛

応用:

<?php
class ParentClass {
    public static function create(): static {
        return new static();  // resolves to calling subclass
    }

    public function getClass(): string {
        return static::class;  // late static binding
    }
}

class ChildClass extends ParentClass {}

$obj = ChildClass::create();
echo $obj->getClass();  // ChildClass

静的ファクトリ

実践的なパターン:

<?php
class Response {
    private function __construct(
        private int   $status,
        private mixed $body
    ) {}

    public static function ok(mixed $data): self {
        return new self(200, $data);
    }

    public static function notFound(): self {
        return new self(404, ['error' => 'Not Found']);
    }

    public function toJson(): string {
        return json_encode(['status' => $this->status, 'body' => $this->body]);
    }
}

echo Response::ok(['users' => []])->toJson();

静的メンバーとインスタンスメンバーのトレードオフ

ベストプラクティス:

<?php
// Static: no object needed, but harder to test/mock
class Validator {
    public static function isEmail(string $s): bool {
        return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
    }
}

// Instance: injectable dependency, testable
class ValidatorService {
    public function isEmail(string $s): bool {
        return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
    }
}
// Prefer instance classes in larger applications

実践的なパターン

静的プロパティとメソッドを使った実践的なパターンに、ここまでの内容をまとめて適用します。

よくある落とし穴

静的プロパティとメソッドでは、次のようなよくある間違いを避けてください:

  • 静的メンバーはすべてのインスタンス間で共有されます
  • 継承されるクラスでは、self::よりも遅延静的束縛(static::)を優先します
  • シングルトンは一般的なパターンですが、過剰に使用されることもあります
  • 静的メソッドは単体テストでモック化することが難しくなります

クイックチェック

継承を考慮した遅延静的束縛で、クラス内部の静的プロパティにアクセスするキーワードは何ですか?

復習:静的プロパティとメソッド

静的プロパティとメソッドについて学習しました。覚えておくべき重要な点は次のとおりです:

  • 静的メンバーはすべてのインスタンス間で共有されます
  • 継承されるクラスでは、self::よりも遅延静的束縛(static::)を優先します
  • シングルトンは一般的なパターンですが、過剰に使用されることもあります
  • 静的メソッドは単体テストでモック化することが難しくなります

よくある質問

「静的プロパティとメソッド」レッスンは無料ですか?

はい。「静的プロパティとメソッド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「静的プロパティとメソッド」で何を学びますか?

staticメンバーを使い、インスタンスなしで呼び出すタイミングを理解します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「静的プロパティとメソッド」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. クラス、プロパティ、メソッド
  2. コンストラクタとデストラクタ
  3. 静的プロパティとメソッド
  4. マジックメソッドの概要
← PHP Academyに戻る