8

したがって、次のようなネストされたクラスを実行しようとすると、次のようになります。

//nestedtest.php

class nestedTest{
    function test(){
         class E extends Exception{}
         throw new E;
    }
}

エラーが発生しますFatal error: Class declarations may not be nested in [...]

しかし、次のような別のファイルにクラスがある場合:

//nestedtest2.php

class nestedTest2{
    function test(){
         include('e.php');
         throw new E;
    }
}

//e.php
class E Extends Exception{}

では、なぜ2番目のハッキーな方法は機能するのに、ハッキーではない方法は機能しないのでしょうか。

4

3 に答える 3

18

マニュアルから ( http://php.net/manual/en/function.include.php ):

ファイルがインクルードされると、そこに含まれるコードは、インクルードが発生した行の変数スコープを継承します。呼び出しファイルのその行で使用可能な変数は、その時点以降、呼び出されたファイル内で使用できます。ただし、インクルード ファイルで定義されているすべての関数とクラスには、グローバル スコープがあります。

于 2010-04-09T14:58:03.577 に答える
1

2番目の方法は、クラスのネストではありません。最初の例とは異なり、両方の宣言が1つのファイルに含まれているだけです。PHPでは、1つのファイルに複数のクラス宣言を含めることができます。これは組織の決定であり、要件ではありません。

于 2010-04-09T14:54:57.990 に答える
1

メソッド内でクラスを定義する正当な理由はありません。2番目の方法は、エラーをスローしないという意味でのみ「機能」します。クラスは、他のすべての定義済みクラスと同じスコープ/名前空間にまだ存在します。したがって、このシナリオでは実際にクラスを「ネスト」していません。

ところで、それが機能する理由は、クラスが単なる定義であるためです。クラスの定義に関連する実行はありません。そのため、そのファイル (e.php) はインクルードするとすぐに解析され、そのクラスが現在の実行コンテキストで使用できるようになります。コードの実行可能な部分 (つまりthrow new E;) のみが、実際に呼び出し元のスコープに属します。

于 2010-04-09T14:58:42.847 に答える