静的メソッドとプロパティ
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 17/91。
プロパティが静的(static)になれるのと同様に、メソッドも個々のオブジェクトではなく、クラス自体に属することができます。静的メソッドは、最初にインスタンスを作成する必要なく、クラスで直接呼び出されます。
static キーワードを使用して静的メソッドを宣言し、クラス名と :: 演算子を使用してそれを呼び出します:
<?php
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
public static function multiply($a, $b) {
return $a * $b;
}
}
echo MathHelper::add(5, 3) . "\n";
echo MathHelper::multiply(4, 2);
出力:
8
8静的メソッドは静的プロパティとうまく連携します。一般的なパターンは、静的メソッドを使用して共有クラスデータを管理することです。
<?php
class Counter {
private static $count = 0;
public static function increment() {
self::$count++;
}
public static function getCount() {
return self::$count;
}
}
Counter::increment();
Counter::increment();
echo Counter::getCount();
出力:
2静的メソッドはオブジェクトのインスタンスが存在しないため、$this を使用できないことに注意してください。これらは self:: を使用して、静的プロパティや他の静的メソッドにのみアクセスできます。
重要なポイント: 静的メソッドは、オブジェクトの状態を必要としないユーティリティ関数や、クラスレベルのデータを管理するために役立ちます。これらは、オブジェクトのインスタンス化を必要とせずに機能を提供します。
チャレンジ
簡単オブジェクトをインスタンス化することなく、静的メソッドとプロパティを使用して一意の識別子を作成するID生成システムを構築しましょう。
コードを整理するために2つのファイルを作成します:
IdGenerator.php— 静的メンバーのみを使用して一意のID生成を管理するIdGeneratorクラスを定義します。このクラスには、0から始まる private な静的プロパティ$lastIdと、"ID"に設定された private な静的プロパティ$prefixを持たせる必要があります。最後のIDをインクリメントし、プレフィックスと新しいIDを組み合わせたフォーマット済みの文字列("ID1"、"ID2"など)を返す静的メソッドgenerate()を作成します。プレフィックスを変更する静的メソッドsetPrefix($newPrefix)と、$lastIdの現在の値を返す静的メソッドgetLastId()を追加してください。main.php— IdGenerator クラスファイルをインクルードします。デフォルトのプレフィックスを使用して2つのIDを生成し、それぞれを個別の行に出力します。次に、静的メソッドを使用してプレフィックスを"USER"に変更し、さらに2つのIDを生成して、それぞれを出力します。最後に、適切な静的メソッドを呼び出して、最後のID番号を出力します。
静的メソッドは ClassName::methodName() を使用してクラス上で直接呼び出され、クラス内では self::$propertyName を使用して静的プロパティにアクセスすることを忘れないでください。オブジェクトのインスタンスが存在しないため、静的メソッド内で $this を使用することはできません。
出力には、異なるプレフィックスを持つIDの推移が表示され、静的プロパティが複数のメソッド呼び出しにわたってどのように値を保持するかを示す必要があります。
チートシート
静的メソッドはクラス自体に属し、インスタンスを作成せずに呼び出されます。staticキーワードを使用して宣言し、クラス名と::演算子を使用して呼び出します。
<?php
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
}
echo MathHelper::add(5, 3); // 8
静的メソッドは、self::を使用して静的プロパティにアクセスできます。
<?php
class Counter {
private static $count = 0;
public static function increment() {
self::$count++;
}
public static function getCount() {
return self::$count;
}
}
Counter::increment();
echo Counter::getCount(); // 1
静的メソッドはオブジェクトのインスタンスが存在しないため、$thisを使用することはできません。self::を使用して、静的プロパティや他の静的メソッドにのみアクセスできます。
静的メソッドは、オブジェクトの状態を必要としないユーティリティ関数や、オブジェクトのインスタンス化を必要とせずにクラスレベルのデータを管理する場合に便利です。
自分で試してみよう
<?php
// IdGeneratorクラスファイルをインクルードする
require_once 'IdGenerator.php';
// TODO: デフォルトのプレフィックスを使用して2つのIDを生成し、それぞれを個別の行に出力する
// TODO: 静的メソッドを使用してプレフィックスを"USER"に変更する
// TODO: さらに2つのIDを生成し、それぞれを個別の行に出力する
// TODO: 適切な静的メソッドを使用して、最後のID番号を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3クラスのプロパティ
インスタンスプロパティと静的プロパティクラス定数静的メソッドとプロパティPrivate と Protected プロパティReadonly プロパティ (PHP 8.1)まとめ:銀行口座マネージャー