PHP では、静的メンバー (メソッドとプロパティ) は個々のオブジェクトではなく、クラス自体に属します。これは、クラスのインスタンスを作成しなくてもアクセスできることを意味します。静的メンバーは、複数のオブジェクト間でデータや機能を共有する場合に便利です。 PHP には、静的メソッドとプロパティにアクセスするための 3 つのキーワード、self::、parent::、static:: が用意されています。特に継承を使用する場合、それぞれの動作は異なります。この記事では、これらのキーワードがどのように機能するかを説明し、例を使用してその違いを示します。
グローバル変数: 静的プロパティはクラス内でグローバル変数として使用でき、すべてのインスタンスにアクセスできます。
ユーティリティ メソッド: 静的メソッドは、個々のオブジェクトから独立したユーティリティ関数を提供できます。
クラス レベルの定数: 静的プロパティを使用して、クラス レベルの定数を定義できます。
シングルトン パターン: 静的メソッドとプロパティは、シングルトン パターンの実装に不可欠です。
静的メソッドを呼び出すには、:: 演算子の後にメソッド名を使用します。以下に例を示します:
class MyClass { public static function greet() { echo "Hello, world!"; } } MyClass::greet(); // Output: Hello, world!
静的プロパティにアクセスするには、:: 演算子の後にプロパティ名を指定することもできます。以下に例を示します:
class MyClass { public static $count = 0; public static function incrementCount() { self::$count++; } } MyClass::incrementCount(); echo MyClass::$count; // Output: 1
自分::
self:: キーワードは、コードが記述されるクラスを参照します。これは継承を考慮していません。つまり、子クラスが静的メソッドまたはプロパティをオーバーライドした場合でも、self:: はコードが定義されている親クラスを参照します。
親::
parent:: キーワードは、直接の親クラスから静的メソッドまたはプロパティを呼び出すために使用されます。これは、子クラスでオーバーライドされたメソッドをバイパスし、親のメソッドまたはプロパティが使用されるようにします。
静的::
static:: キーワードは self:: と同様に機能しますが、遅延静的バインディングを考慮します。これは、静的メソッドまたはプロパティが子クラスでオーバーライドされた場合、たとえ親クラスから呼び出されたとしても、static:: は最も派生したクラスのメソッドまたはプロパティを参照することを意味します。
これらの各キーワードが継承のある PHP プログラムでどのように動作するかを見てみましょう。
class A { public static function sayHello() { return "Hello from A"; } public static function test() { return self::sayHello(); } } class B extends A { public static function sayHello() { return "Hello from B"; } } echo B::test(); // Output: "Hello from A"
この例では、クラス A の self:: は A のsayHello() メソッドを参照します。クラス B がメソッドをオーバーライドしても、self:: は親クラスのメソッドを呼び出し、出力「Hello from A.」を生成します。
class A { public static function sayHello() { return "Hello from A"; } } class B extends A { public static function sayHello() { return parent::sayHello() . " and B"; } } echo B::sayHello(); // Output: "Hello from A and B"
この例では、クラス B はparent::sayHello() を呼び出して親クラス A からのメッセージを組み込み、独自のメッセージを追加します。出力は「A と B からこんにちは。」
class A { public static function sayHello() { return "Hello from A"; } public static function test() { return static::sayHello(); } } class B extends A { public static function sayHello() { return "Hello from B"; } } echo B::test(); // Output: "Hello from B"
ここで、クラス A の static:: は、最も派生したクラス (B) のメソッド SayHello() を参照しています。これは、static:: が遅延静的バインディングを許可しており、クラス B のメソッドが呼び出され、その結果、 「Bからこんにちは。」
self::: 継承を無視して、それが使用されているクラスを参照します。これは、子クラスのメソッドが呼び出されるメソッドに影響を与えたくない場合に便利です。
parent::: 子クラスでオーバーライドされている場合でも、親クラスからメソッドまたはプロパティを具体的に呼び出します。これは、親クラスから機能を拡張しながらも元のメソッドにアクセスする必要がある場合に便利です。
static::: 遅延静的バインディングを有効にします。つまり、親クラスから呼び出された場合でも、実行時に最も派生したクラスのメソッドまたはプロパティを参照します。これは、呼び出しクラスに応じて動作を調整したい場合に便利です。
self::、parent::、static:: の違いを理解すると、特に複雑なオブジェクト指向システムにおいて、より堅牢で保守しやすい PHP コードを作成するのに役立ちます。
以上がPHP の静的メンバーを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。