第10章 オブジェクト指向構文 / 第4回 模擬試験
PHPの遅延静的束縛(Late Static Binding)に関する次の記述のうち、正しいものはどれか。
`static::`キーワードを使うと、呼び出し元の実際のクラスを基準にメソッドが解決される。
正解
`self::`と`static::`は、継承関係があっても常に全く同じ動作をする。
遅延静的束縛はインスタンスメソッドでのみ有効で、静的メソッドでは使用できない。
遅延静的束縛はPHP5より前のバージョンから存在する古い機能である。
解説
`static::`は、そのメソッドが「実際にどのクラス経由で呼び出されたか」を実行時に判定して解決される仕組みです(遅延静的束縛)。継承関係にあるクラスで、親クラスのメソッドから`static::`を使うと、実際に呼び出された子クラス側のメソッドやプロパティが参照されます。
他の選択肢が誤りである理由は次の通りです。
・`self::`は「そのメソッドが定義されているクラス」に固定して解決されるのに対し、`static::`は「実際に呼び出されたクラス」を基準に解決されます。継承関係がある場合、両者の挙動は異なります。
・遅延静的束縛は、静的メソッド(`static function`)でこそ真価を発揮する仕組みです。「静的メソッドでは使用できない」は誤りです。
・遅延静的束縛はPHP 5.3で導入された比較的新しい機能です。「PHP5より前から存在する」は誤りです。
例:
```
class Base {
public static function create(): static {
return new static(); // 呼び出されたクラスのインスタンスを生成
}
}
class Child extends Base {}
echo get_class(Child::create()); // Child(selfだとBaseになってしまう)
```
(参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.3.7節 遅延静的束縛 p.509〜510)