0

多くのクラス拡張を使用すると、次のエラーが発生します。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65488 bytes) in C:\Web\private\bootstrap.php on line 5(これが実際に以下のコードの行であることを確認しました。元のコードは 22 行目です。)

これは私のコードです (大幅に簡略化されていますが、それでもエラーが発生します。元のコードにはthis->this6 レベルの深さがあります!)。

class test { // Root class.
    public $system;
    function __construct() {
        $this->system = new system();
    }
}
class system extends test { // System classes and methods.
    public function demo($string = 0){echo $string;}
}
$test = new test();
$test->system->demo("hello");

これは単に出力されるはずhelloですが、残念ながら代わりにエラーがスローされます。この問題の原因は何ですか?

4

3 に答える 3

3

再帰

をインスタンス化すると、メソッドを呼び出してsystemいる拡張が行われ、メソッドが新しいオブジェクトを作成し、拡張して呼び出します。test__construct()systemtest__construct()

extendsの場合、クラスに新しいsystemオブジェクトを作成するのはなぜですか?testsystemtest

于 2013-02-13T21:53:58.820 に答える
0

コードが再帰の無限ループを引き起こしています。

新しい Test を作成すると、新しい System が作成され、Test のコンストラクターが呼び出され (継承されているため)、新しい System ... が作成されます。繰り返します。

システムから継承を削除すると、正常に動作します。

class system { // System classes and methods.
    public function demo($string = 0){echo $string;}
}
于 2013-02-13T21:54:16.520 に答える
0

無限ループを作成しています。

インスタンス化しようとすると、new test(). コンストラクターは新しいシステム オブジェクトを作成します (それ自体がテスト オブジェクトです。その後、別のシステム オブジェクトをインスタンス化し、メモリが不足するまで繰り返します。

新しいシステム オブジェクトをインスタンス化するためにシステム オブジェクトが必要ない場合は、コンストラクターをオーバーライドする必要があります (空の関数でも)。

于 2013-02-13T22:05:15.720 に答える