採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

static プロパティ・メソッド

テクノロジ系 / class-advanced (継承 / オーバーライド / abstract / interface / static / const / final)

static プロパティ・メソッド

Lesson 9 / Chapter 6

普通のプロパティはインスタンスごとに別

<?php
class User {
    public string $name;
}

$a = new User();
$a->name = "A";

$b = new User();
$b->name = "B";

echo $a->name . "\n";  // A
echo $b->name . "\n";  // B
  • インスタンスを 2 つ作れば、$name も 2 つ存在する
  • でも「全インスタンスで共有する値」が欲しいときがある

static プロパティはクラスで 1 つだけ

<?php
class User {
    public static int $count = 0;
}

User::$count = 5;
echo User::$count . "\n";  // 5
  • static を付けると クラス全体で 1 つ だけ存在する
  • インスタンスを作らなくても使える
  • 外からは ClassName::$プロパティ名 で参照

クラス内からは self:: で参照

<?php
class User {
    public static int $count = 0;

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

new User();
new User();
new User();
echo User::$count . "\n";  // 3
  • クラスの中では self::$count と書く
  • インスタンスを作るたびにコンストラクタで ++ する
  • User::$count は全インスタンスで共有されているので「合計人数」になる

static メソッドも書ける

<?php
class Calc {
    public static function add(int $a, int $b): int {
        return $a + $b;
    }
}

echo Calc::add(2, 3) . "\n";  // 5
  • static function で定義
  • 呼び出しは ClassName::method()
  • インスタンスを作らずに使える (ユーティリティ向き)

このチャプターでできるようになること

static プロパティはクラスで 1 つだけ

self::$name (中) / Class::$name (外) で参照できる

static function でインスタンス不要のメソッドを定義できる

✅ インスタンス数カウンタなどに使える

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

ドリル 01 — User インスタンス数を数える

問題

User クラスを定義してください。

  • public static int $count = 0; を持つ
  • コンストラクタ __construct() の中で self::$count++; する

User のインスタンスを 3 つ作ったあと、User::$count を 1 行出力してください。

期待される出力:

3

採点

php scripts/grade.php topics/class-advanced/ch06-static/drill/01-counter/

ヒント

  • クラスの中では self::$count++ で増やす
  • クラスの外では User::$count で参照
  • new User(); を 3 回呼ぶ