概要
static::
とself::
はクラスのスタティックメソッドを指すときに使えるが、それぞれ以下のような違いがある。
static
はそれが実行されるときのクラスを指すself
はそれが定義されたときのクラスを指す
準備
以下のようにParentClass
とそれを継承したChildClass
を準備する。
- いずれも同じ名前の
static
メソッドstatic_method()
を持つ - それぞれのクラスはインスタンスメソッド
parent_method()
、child_method()
を持つ- 何れの内容も同じで、
static::static_method()
とself::static_method()
を実行する
- 何れの内容も同じで、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php class ParentClass { public static function static_method() { echo 'in ParentClass', PHP_EOL; } public function parent_method() { static::static_method(); self::static_method(); } } class ChildClass extends ParentClass { public static function static_method() { echo 'in ChildClass', PHP_EOL; } public function child_method() { static::static_method(); self::static_method(); } } |
クラスからstaticメソッドを呼ぶ
クラスからstatic
メソッドを呼ぶと、当然それぞれに対応したstatic_method()
が実行される。
1 2 3 4 5 |
ParentClass::static_method(); ChildClass::static_method(); // static method of Parent // static method of Child |
親クラスのメソッドから呼ぶ
親クラスのインスタンスを作って、インスタンスメソッドparent_method()
内でstatic
、self
でstatic_method()
を呼び出す場合。
親クラスのstatic
メソッドしか対象がないので、いずれの場合も親クラスのstatic_method()
が実行される。
1 2 3 4 5 |
$parent = new ParentClass(); $parent->parent_method(); // in ParentClass // in ParentClass |
子クラスのメソッドから呼ぶ
子クラスのインスタンスを作って、インスタンスメソッドchild_method()
内でstatic
、self
でstatic_method()
を呼び出す場合。
static
、self
とも子クラスを指し、子クラスのインスタンスメソッドが実行される。
1 2 3 4 5 |
$child = new ChildClass(); $child->child_method(); // in ChildClass // in ChildClass |
子クラスで親クラスのメソッドから呼ぶ
子クラスのインスタンスを作って、継承元の親クラスのインスタンスメソッドparent_method()
からstatic
、self
でstatic_method()
を呼び出す場合。
1 2 3 4 5 |
$child = new ChildClass(); $child->parent_method(); // in ChildClass // in ParentClass |
static
は実行時のクラスを指すため、Child
クラスのstatic_method()
が実行される。
一方self
は定義時のクラスを指すため、parent_method()
が定義されたParentClass
のstatic_method()
が実行される。