私はデザインパターンを学んでいます。以前にシングルトンパターンについての記事がありましたが、静的キーワードの理解があまり信頼できないことに気づきましたので、もう一度見直します。
静的キーワード
static キーワードは、PHP マニュアルで次のように導入されています。
コードをコピーします コードは次のとおりです:
クラスのプロパティまたはメソッドを静的として宣言すると、クラスのインスタンス化を必要とせずにアクセスできるようになります。静的として宣言されたプロパティには、インスタンス化されたクラス オブジェクトではアクセスできません (ただし、静的メソッドではアクセスできます)。
一般的な意味は、クラスのプロパティとメソッドを静的として宣言した後、オブジェクトをインスタンス化せずに静的プロパティとメソッドに直接アクセスできることです。
1. クラスのインスタンスを介して静的メンバーにアクセスすることはできませんが、静的メソッドはアクセスできます。
2. -> 演算子を使用して静的メンバーにアクセスすることはできません。
3. 静的メソッドのスコープ内では、$this キーワードを使用できません。つまり、静的メソッドでは通常のメンバー変数にアクセスできません。
4. 静的メンバーとメソッドには、オブジェクトをインスタンス化せずに、クラス名を介して直接アクセスできます。
遅延静的バインディング
以下の内容はPHPマニュアルからの抜粋です:
コードをコピーします コードは次のとおりです:
PHP 5.3.0 以降、PHP には、継承スコープ内で静的に呼び出されたクラスを参照するための遅延静的バインディングと呼ばれる機能が追加されました。
正確に言うと、遅延静的バインディングの動作原理は、前の「非転送呼び出し」にクラス名を保存することです。静的メソッド呼び出しを行う場合、クラス名は明示的に指定されたもの (通常は :: 演算子の左側) であり、非静的メソッド呼び出しを行う場合は、オブジェクトが属するクラスです。いわゆる「転送呼び出し」とは、self::、parent::、static::、および forward_static_call() の方法で行われる静的呼び出しを指します。 get_called_class() 関数を使用すると、呼び出されたメソッドのクラス名を取得でき、static:: はそのスコープを示します。
この機能を理解するには、マニュアルの例を参照してください
自己 vs 静的
デモを使用して、self と static の違いを直接説明します。
自己例:
コードをコピーします コードは次のとおりです:
クラス車両{
Protected static $name = 'これは車両です';
パブリック静的関数 what_vehicle() {
echo get_called_class()."n";
エコー self::$name;
}
}
クラスセダンは車両を拡張します {
Protected static $name = 'これはセダンです';
}
セダン::what_vehicle();
プログラム出力:
コードをコピーします コードは次のとおりです:
セダン
これは乗り物です
静的な例:
コードをコピーします コードは次のとおりです:
クラス車両{
Protected static $name = 'これは車両です';
パブリック静的関数 what_vehicle() {
echo get_named_class()."n";
エコー静的::$name;
}
}
クラスセダンは車両を拡張します {
Protected static $name = 'これはセダンです';
}
セダン::what_vehicle();
プログラム出力:
コードをコピーします
コードは次のとおりです:
セダン
これはセダンです
まとめ