Menu
Coddy logo textTech

インスタンスプロパティと静的プロパティ

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 15/91。

クラス内にプロパティを作成するとき、それが個々のオブジェクトに属するのか、それともクラス自体に属するのかを決定する必要があります。この区別が、インスタンスプロパティと静的プロパティの違いです。

インスタンスプロパティがデフォルトです。各オブジェクトはプロパティの独自のコピーを保持し、あるオブジェクトでその値を変更しても、他のオブジェクトには影響しません。

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name . "\n";
echo $bob->name . "\n";

出力:

Alice
Bob

静的プロパティは、特定のオブジェクトではなく、クラスに属します。これらは static キーワードを使用して宣言し、オブジェクトの -> の代わりに、クラス名と :: を使用してアクセスします:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count;

出力:

2

$count がすべてのインスタンス間で共有されていることに注目してください。新しい User を作成するたびに、同じ $count 変数がインクリメントされます。クラス内では、静的プロパティを参照するために self::$count を使用します。

重要なポイント: 各オブジェクトが独自の値を必要とする場合は、インスタンスプロパティを使用します。インスタンスのカウントや設定の保存など、クラスのすべてのオブジェクト間でデータを共有する必要がある場合は、静的プロパティを使用します。

challenge icon

チャレンジ

簡単

インスタンスプロパティ(各訪問者に固有)と静的プロパティ(すべての訪問者で共有)の違いを示す、訪問者追跡システムを構築しましょう。

コードを整理するために、2つのファイルを作成します。

  • Visitor.php — 個々の訪問者を追跡し、総訪問者数をカウントし続けるVisitorクラスを定義します。各訪問者は独自の$nameプロパティ(インスタンスプロパティ)を持つ必要があり、一方で$totalVisitorsプロパティはすべてのインスタンス間で共有される必要があります(静的プロパティ)。コンストラクタは名前を受け取って設定し、総訪問者数をインクリメントします。"[name] is visitor #[totalVisitors]"を返すgetInfo()メソッドを追加してください。
  • main.php — Visitorクラスのファイルをインクルードし、"Alice""Bob""Charlie"という名前の3人の訪問者を(この順序で)作成します。3人すべてを作成した後、各訪問者に対してgetInfo()を呼び出した結果を出力し(それぞれ改行して出力)、その後、Visitor::$totalVisitorsを使用してクラスから直接静的プロパティにアクセスし、総訪問者数を出力します。

クラス内ではself::$propertyNameを使用して静的プロパティにアクセスし、クラス外からはClassName::$propertyNameを使用することを覚えておいてください。インスタンスプロパティには、通常通り$this->propertyNameでアクセスします。

出力には、各訪問者と割り当てられた番号が表示され、最後の行に最終的な合計数が表示されるはずです。

チートシート

インスタンスプロパティは個々のオブジェクトに属しますが、静的プロパティはクラス自体に属し、すべてのインスタンスで共有されます。

インスタンスプロパティ:

各オブジェクトは、プロパティの独自のコピーを保持します。

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name; // Alice
echo $bob->name;   // Bob

静的プロパティ:

static キーワードを使用して宣言され、すべてのインスタンスで共有されます。

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count; // 2

静的プロパティへのアクセス:

  • クラス内: self::$propertyName
  • クラス外: ClassName::$propertyName

インスタンスプロパティへのアクセス:

  • クラス内: $this->propertyName
  • クラス外: $object->propertyName

自分で試してみよう

<?php
// Visitorクラスをインクルードする
require_once 'Visitor.php';

// TODO: "Alice"、"Bob"、"Charlie"という名前の3人のビジターを作成する(この順序で)

// TODO: 各ビジターのgetInfo()の結果を表示する(それぞれを個別の行に)

// TODO: Visitor::$totalVisitorsを使用して、ビジターの総数を表示する
?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン