2

エラーの下のコードを使用すると、次のエラーが発生します。私が間違っていることを教えてもらえますか?

致命的なエラー: D:\dev\TESTCASE_classes_layout\main.class.php 行 18 で、134217728 バイトの許容メモリ サイズが使い果たされました (32 バイトを割り当てようとしました)

ここに私が使用するコードがあります:

<?php

include('test_class1.php');
include('test_class2.php');
include('test_class3.php');

class Main_Class{

    protected $test_class1;   
    protected $test_class2;
    protected $test_class3;

    private $objects_array = array();


    public function Main_Class(){

        $this->test_class1 = new Test_Class1();
        $this->objects_array['test_class1'] = $this->test_class1; 
        $this->test_class2 = new Test_Class2();
        $this->objects_array['test_class2'] = $this->test_class2;
        $this->test_class3 = new Test_Class3();
        $this->objects_array['test_class3'] = $this->test_class3;

    }

    public function get_Objects(){

        return $this->objects_array;

    }

}

?>

3 つのテスト クラスすべてに使用するコードを次に示します。クラス名番号と関数名番号だけ全く同じコードです。

<?php

class Test_Class1 extends Main_Class{

    function test1(){
        return 'hello';
    }

}

?>

それは拡張部分に関係しています。拡張部分を削除すると機能します。

これが私の目標です:

このクラスのクラスをインスタンス化し、そこから拡張して、クラスの別のインスタンスを生成せずにすべてのクラスが相互に呼び出せるようにしようとしています。

もっと良い方法があるかもしれませんので、もしご存知でしたら教えてください。

4

4 に答える 4

1

Main_Classtypeのオブジェクトまたはそのサブクラスの 1 つを作成するたびに、コンストラクタが呼び出されます。

この作成中にサブタイプの新しいオブジェクトを作成しているため、メモリが使い果たされるかメモリ制限に達すると終了する無限ループに遭遇します。

new Main_Class()            calls ...
Constructor of Main_Class   calls ...
new Test_Class1()           calls ...
Constructor of Test_Class1  calls ...
Constructor of Main_Class   calls ...
new Test_Class1()           calls ...
...

代わりに、静的メソッドでオブジェクトを作成する必要があります。ただし、そうする場合でも、目標がカプセル化の重要な原則に違反しており、非常に貧弱な設計につながることに注意してください。代わりに、 type の任意のオブジェクトで動作するメソッドを持ちMain_Class、メソッドをオーバーライドしたい (つまりtest、これらのクラスのすべてにメソッドを持っている) ことをお勧めします。

于 2012-01-02T16:11:21.440 に答える
1

3つのクラスすべてがメインクラスを拡張しており、メールクラスのコンストラクターで3つのクラスすべてを呼び出しているため、このメモリ不足エラーが発生しています..

つまり、子クラスのいずれかのインスタンスを作成しようとすると、それらは親クラスに移動し、親クラスが再びそれらを呼び出します..したがって、無限ループに陥り、php メモリが使い果たされます..

そのため、拡張しようとするとエラーが発生し、それがなくても十分に機能します..

次の部分は、他の2つのクラスの属性を取得する方法です..

まず第一に、そのようなケースが必要な理由はわかりません。クラス内のすべての関数を定義し、それをすべて拡張して呼び出すことができます...それでも永続する場合は、インスタンスを個別に作成する以外に選択肢はありません。 ..:)

于 2012-01-02T14:57:21.027 に答える
1

無限再帰を取得しています。Test_Class1次のようなコンストラクタ関数を追加してみてください

function Test_Class1 () {}

Test_Class1 をインスタンス化するときに基本コンストラクターの呼び出しを防止する

編集:一般的な注意として、クラスコンストラクターで同じクラスまたは子クラスをインスタンス化しないでください。これにより、問題、無限再帰が発生します。幸いなことに、PHP は、子コンストラクターを継承して指定するときに、親のコンストラクターを自動的に呼び出しません。ただし、他のほとんどの OO 言語では、このパターンは 100% の確率で壊れます。

于 2012-01-02T15:00:47.453 に答える
0

このスレッドを確認してください33554432 バイトのメモリ サイズが使い果たされました (43148176 バイトを割り当てようとしました)。実際にはスクリプトではなく、構成に関連している可能性があります。

また、エラーによって指定されたメモリ使用量を読み取るのが難しい場合があるため、インスタンス化も確認してください。なんらかのループがあるのか​​もしれません。プラグインなどを含むフレームワークを使用していますか?

于 2012-01-02T14:55:49.367 に答える