从类扩展时出现内存错误

时间:2012-01-02 13:44:43

标签: php class memory instances

使用错误下方的代码时出现以下错误。 你能告诉我我做错了吗?

  

致命错误:在第18行的D:\ dev \ TESTCASE_classes_layout \ main.class.php中,允许的内存大小为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;

    }

}

?>

这是我用于所有三个测试类的代码。它与类名号和函数名号完全相同。

<?php

class Test_Class1 extends Main_Class{

    function test1(){
        return 'hello';
    }

}

?>

它与扩展部分有关。因为当我删除扩展部分时它会起作用。

这是我的目标:

我正在尝试实例化此类中的类并从中扩展,以便所有类可以相互调用而不生成该类的另一个实例。

也许有更好的方法可以做到这一点,如果你知道那就告诉我。

4 个答案:

答案 0 :(得分:1)

Dude这个内存耗尽错误正在发生,因为所有三个类都在扩展主类,并且在邮件类的构造函数中你正在调用所有3个类..

这意味着当您尝试创建任何子类的实例时,它们将转到父类,而父类又将再次调用它们。因此,您处于无限循环中......并且php内存是耗尽..

这就是为什么如果你试图扩展......并且在没有这个的情况下工作得很好的话就会给出错误。

现在接下来的部分是如何获取其他2个类的属性..

首先,我没有看到你需要这种情况的任何理由,你可以只定义一个类中的所有函数并将其扩展并调用它们...... 如果你仍然坚持,你别无选择,只能单独创建实例...... :)

答案 1 :(得分:1)

你得到了无限的递归。 尝试在Test_Class1中添加构造函数,例如

function Test_Class1 () {}

以防止在实例化Test_Class1

时调用基础构造函数

编辑:作为一般说明,你不应该在类构造函数中实例化同一个类或子类,因为这会导致你的问题,无限递归。幸运的是,PHP在继承和指定子构造函数时不会自动调用父的构造函数。但是,在大多数其他OO语言中,这种模式会在100%的时间内中断。

答案 2 :(得分:1)

每次创建类型为Main_Class或其子类的对象时,都会调用构造函数。

由于您在创建过程中创建了子类型的 new 对象,因此会遇到无限循环,该循环在内存耗尽或达到内存限制时结束:

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

相反,您应该在静态方法中创建对象。但即使你这样做,也要注意你的目标违反了encapsulation的重要原则,并且会导致设计极其糟糕。相反,您可能希望拥有对Main_Class类型的任意对象进行操作的方法,并覆盖这些方法(即在每个类中都有方法test)。

答案 3 :(得分:0)

检查此帖子Allowed memory size of 33554432 bytes exhausted (tried to allocate 43148176 bytes) in php,因为它可能会帮助您。它实际上可能与您的脚本无关,但与您的配置有关。

同时检查实例化,因为读取错误给出的内存使用可能很棘手。也许有某种循环。您是否正在使用某些带插件的框架?