PHPの関数・クラス定義のスコープについて
PHPのクラス定義のスコープに付いてのメモ。
PHPでは、トップレベルに記述されたクラス・関数定義は、
スクリプトファイルの実行前に定義が読み込まれます。
例えば、以下のコードで、a.phpを実行した場合、正常に動作します。
/* a.php */
require 'b.php';
class A {
}/* b.php */
class B extends A {
}
クラスAの定義の前に、クラスAを継承したクラスBの定義を含むb.phpを読み込んでいます。
Aの定義が、requireの前に読み込まれてるから、エラーが起きないようです。
一方、同じトップレベルでも、ifやtry等で括ったなかに定義を書くと先読みされません。
例えば、以下のコードはclass undefinedのエラーが発生します。
/* a.php */
require 'b.php';
if (true) {
class A {
}
}/* b.php */
class B extends A {
}
if文の中に記述しても、関数・クラス定義はグローバルのスコープで定義されるのですが、
定義の先読みの有無に関しては、動作が異なるって事でしょうか。
以下のコードは、動作します。
/* a.php */
if (true) {
class A {
}
}
require 'b.php';/* b.php */
class B extends A {
}
クラス定義の代わりに、関数を定義しても同様のようです。
ちなみに、以下のようにgoto文を使ってクラス定義をスキップしても、
トップレベルに記述した場合は、クラスが定義されます。
goto jump;
class A {
}
jump: