使用错误下方的代码时出现以下错误。 你能告诉我我做错了什么吗?
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in D:\dev\TESTCASE_classes_layout\main.class.php on line 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';
}
}
?>
这与延伸部分有关。因为当我删除扩展部分时它会起作用。
这是我的目标:
我正在尝试实例化此类中的类并从中扩展,以便所有类都可以相互调用,而无需生成该类的另一个实例。
也许有更好的方法,如果您知道,请告诉我。
最佳答案
每次创建 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 ...
...
相反,您应该在静态方法中创建对象。但即使你这样做了,请注意你的目标违反了encapsulation的重要原则。并将导致极其糟糕的设计。相反,您可能希望拥有对 Main_Class
类型的任意对象进行操作的方法,并重写这些方法(即在每个类中都有一个 test
方法)。
关于php - 从类扩展时出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8701579/