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: