PHP staticキーワードとselfキーワードのインスタンス化の違い

1233 ワード

インスタンス化ではstaticキーワードはselfキーワードに似ていますが、staticキーワードは呼び出されたクラスを指し、selfキーワードはクラスを含むことを指します.
このように言うのはよく理解できないかもしれませんが、次に例を挙げます.
まず、拡張クラスで共有できる機能を持つスーパークラスDomainObjectを作成し、次にサブクラスDocumentを作成します.
コードは次のとおりです.
abstract class DomainObject {
    public static function create() {
        return new self();
    }
}

class Document extends DomainObject {
}

Document::create();

サンプルコードでは、一般的なメソッドcreate()を親クラスに配置し、selfキーワードをクラスへの参照として使用します.ここでは、selfキーワードに対する仮定です.実際、selfキーワードがクラスに与える役割は、$thisがオブジェクトに与える役割とは完全に同じではありません.selfキーワードは呼び出しコンテキストではなく、解析コンテキストを指します.したがって、サンプル・コードを実行すると、次のようになります.
PHP Fatal error: Cannot instantiate abstract class DomainObject in ...
このことから、selfキーワードは、selfを呼び出すDocumentクラスではなく、create()を定義するDomainObjectとして解析されることが分かる.
selfキーワードをstaticキーワードに置き換えると、次のことができます.
abstract class DomainObject {
    public static function create() {
        return new static();
    }
}

class Document extends DomainObject {
}

Document::create();

実行可能:
Document Object{}
これにより、staticキーワードはselfキーワードに似ているが、クラスを含むのではなく呼び出されたクラスを指すと結論した.この例では、呼び出しDocument::create()は、DomainObjectオブジェクトをインスタンス化しようとするのではなく、新しいDocumentオブジェクトを生成することを意味する.