ошибка памяти при расширении из класса - PullRequest
2 голосов
/ 02 января 2012

Я получаю следующую ошибку при использовании кода ниже ошибки. можешь сказать, что я делаю не так?

Неустранимая ошибка: допустимый объем памяти 134217728 байт исчерпан (попытка выделить 32 байта) в D: \ dev \ TESTCASE_classes_layout \ main.class.php в строке 18

Вот код, который я использую:

<?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;

    }

}

?>

Вот код, который я использую для всех трех тестовых классов. Это точно такой же код только для номера класса и номера функции.

<?php

class Test_Class1 extends Main_Class{

    function test1(){
        return 'hello';
    }

}

?>

Это связано с расширяющейся частью. Потому что, когда я удаляю расширяющую часть, она работает.

Вот моя цель:

Я пытаюсь создавать экземпляры классов в этом классе и расширять его, чтобы все классы могли вызывать друг друга, не генерируя другой экземпляр класса.

может быть, есть лучший способ сделать это, так что если вы знаете это, дайте мне знать.

Ответы [ 4 ]

1 голос
/ 02 января 2012

Конструктор вызывается каждый раз, когда вы создаете объект типа Main_Class, или один из его подклассов .

Поскольку вы создаете новые объекты подтипа во время этого создания, вы попадаете в бесконечный цикл, который заканчивается, когда память исчерпана или достигнут предел памяти:

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 ...
...

Вместо этого вы должны создавать объекты в static методе. Но даже если вы это сделаете, обратите внимание, что ваша цель нарушает важный принцип инкапсуляция и приведет к крайне плохому дизайну. Вместо этого вам, вероятно, нужно иметь методы, которые работают с произвольным объектом типа Main_Class и переопределяют методы (т. Е. Имеют метод test в каждом из этих классов).

1 голос
/ 02 января 2012

Чувствую, что эта ошибка исчерпана в памяти, происходит потому, что все три класса расширяют основной класс, и в конструкторе почтового класса вы вызываете все 3 класса.

Что означает, когда вы попытаетесь создатьэкземпляр любого из дочерних классов, которые они перейдут в родительский класс, который, в свою очередь, вызовет их снова .. Следовательно, вы находитесь в бесконечном цикле ... и php-память исчерпана ..

Вот почему он выдает ошибку, если вы пытаетесь расширить ... и хорошо работать без него ..

Теперь следующая часть - как получить атрибуты других 2 классов ..

Прежде всего, я не вижу причин, по которым вам нужен такой случай, вы можете просто определить все функции в классе, расширить его во всех и вызвать их ... Если вы все еще сохранитесь, у вас нет другого выбора, кроме отдельного создания экземпляра....:)

1 голос
/ 02 января 2012

Вы получаете бесконечную рекурсию.Попробуйте добавить функцию конструктора в Test_Class1, например,

function Test_Class1 () {}

, чтобы предотвратить вызов базового конструктора при создании экземпляра Test_Class1

РЕДАКТИРОВАТЬ.класс или дочерний класс в конструкторе класса, поскольку это приводит к вашей проблеме, бесконечной рекурсии.К счастью для вас, PHP не вызывает автоматически родительский конструктор при наследовании и указании дочернего конструктора.Однако в большинстве других ОО-языков этот шаблон будет нарушен в 100% случаев.

0 голосов
/ 02 января 2012

Проверьте эту тему Допустимый объем памяти 33554432 байта исчерпан (попытался выделить 43148176 байтов) в php , поскольку это может помочь вам. На самом деле это может относиться не к вашему сценарию, а к вашей конфигурации.

Также проверьте создание экземпляров, так как может быть сложно прочитать использование памяти, заданное ошибкой. Может быть, есть какая-то петля. Вы используете какой-то фреймворк с плагинами или около того?

...