2

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

致命错误:第 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

4 回答 4

1

老兄,这个内存耗尽错误正在发生,因为所有三个类都在扩展主类,并且在邮件类的构造函数中,您正在调用所有 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 回答
1

每次创建类型对象或其子类之一时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 ...
...

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

于 2012-01-02T16:11:21.440 回答
0

检查这个线程允​​许的内存大小 33554432 字节用尽(试图分配 43148176 字节)在 php中,因为它可以帮助你。它实际上可能与您的脚本无关,但与您的配置有关。

还要检查实例化,因为读取错误给出的内存使用可能很棘手。也许有某种循环。你在使用一些带有插件的框架吗?

于 2012-01-02T14:55:49.367 回答