PHP – new staticとnew self

概要

staticselfnewと組み合わせることでクラス内でインスタンスを生成する際に使えるが、以下のような違いがある。

  • new staticはそれが実行されるときのクラスのインスタンスを生成する
  • new selfはそれが定義されたときのクラスのインスタンを生成する

参照:static::とself::

準備

以下のようにParentClassとそれを継承したChildClassを準備する。

  • いずれも同じ名前のインスタンスメソッドmethod()を持つ
  • それぞれのクラスはスタティックメソッドparent_method()child_method()を持つ
  • 何れの内容も同じで、以下を実行する
    • (new static)->static_method()
    • (new self)->static_method()

new staticnew selfはクラスのインスタンスを生成する。この例では()->で生成されたインスタンスから直接メソッドを呼び出しているが、$instance = new staticのように一旦変数に参照させて$instance->method()としてもよい。

親クラスのメソッドで生成する場合

親クラスのメソッド内でstaticselfで生成されるインスタンスは親クラスのインスタンス。

子クラスのメソッドで生成する場合

子クラスのメソッド内でstaticselfで生成されるインスタンスは子クラスのインスタンス。

継承元の親クラスのメソッドで生成する場合

子クラスから継承元の親クラスのメソッドを呼んで、その中でstaticselfで生成されるインスタンスは以下の通り。

これらは以下のような動作による。

子クラスから呼ばれた親クラスのスタティックメソッドで以下が実行される。

new staticで生成されるのは、この文が実行されるときにスタティックメソッドを呼び出したChildClassなので、ChildClassのインスタンスが生成されて、そのmethod()が呼ばれる。

new selfで生成されるのは、この文が定義されたParentClassなので、ParentClassのインスタンスが生成されて、そのmethod()が呼ばれる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です