使用错误下方的代码时出现以下错误。 你能告诉我我做错了吗?
致命错误:在第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';
}
}
?>
它与扩展部分有关。因为当我删除扩展部分时它会起作用。
这是我的目标:
我正在尝试实例化此类中的类并从中扩展,以便所有类可以相互调用而不生成该类的另一个实例。
也许有更好的方法可以做到这一点,如果你知道那就告诉我。
答案 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,因为它可能会帮助您。它实际上可能与您的脚本无关,但与您的配置有关。
同时检查实例化,因为读取错误给出的内存使用可能很棘手。也许有某种循环。您是否正在使用某些带插件的框架?