PHP staticキーワードとselfキーワードのインスタンス化の違い
1233 ワード
インスタンス化ではstaticキーワードはselfキーワードに似ていますが、staticキーワードは呼び出されたクラスを指し、selfキーワードはクラスを含むことを指します.
このように言うのはよく理解できないかもしれませんが、次に例を挙げます.
まず、拡張クラスで共有できる機能を持つスーパークラスDomainObjectを作成し、次にサブクラスDocumentを作成します.
コードは次のとおりです.
サンプルコードでは、一般的なメソッドcreate()を親クラスに配置し、selfキーワードをクラスへの参照として使用します.ここでは、selfキーワードに対する仮定です.実際、selfキーワードがクラスに与える役割は、$thisがオブジェクトに与える役割とは完全に同じではありません.selfキーワードは呼び出しコンテキストではなく、解析コンテキストを指します.したがって、サンプル・コードを実行すると、次のようになります.
PHP Fatal error: Cannot instantiate abstract class DomainObject in ...
このことから、selfキーワードは、selfを呼び出すDocumentクラスではなく、create()を定義するDomainObjectとして解析されることが分かる.
selfキーワードをstaticキーワードに置き換えると、次のことができます.
実行可能:
Document Object{}
これにより、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オブジェクトを生成することを意味する.