我一直在制作自己的PHP框架,我遇到了这个问题,我找不到答案,所以要把它作为一种模式我用这种方式编码:
class post_control extends LoopControl
{
var $model;
function __construct()
{
parent::__construct();
$classname = get_class($this);
$this->model = new $classname();
}
}
我收到此错误:
致命错误:第23行的/opt/lampp/htdocs/LoopWork/admin/core/model/Form.class.php中允许的内存大小为134217728个字节(试图分配77个字节)<
问题2:
我真的在用这么多记忆吗?怎么样?
事实1:
如果我编写新的post_model();我没有收到这个错误。
考虑到事实1我认为这些方法在制定一个新的立场之间存在差异。
谢谢!
答案 0 :(得分:1)
在您的示例中,您基本上无限次地创建post_control
的实例。这就是您的脚本消耗所有内存的原因。
class post_control extends LoopControl
{
var $model;
function __construct()
{
parent::__construct();
$classname = get_class($this);
$this->model = new $classname(); // this is the line where you instantiate a
//new post_control, and again post_control constructor is call, and a new instance
//is created.. and so on for infinite times
}
}
答案 1 :(得分:0)
是的,你 耗尽了系统的所有内存。那是因为你的构造函数创建了一个无限递归:
class post_control extends LoopControl
{
var $model;
function __construct()
{
parent::__construct();
$classname = get_class($this); // evaluates to 'post_control'
$this->model = new $classname(); // equiv to new post_control();
}
}
创建post_control
后,它会尝试为其post_control
属性创建另一个$model
。反过来,这将调用相同的构造函数,该构造函数将尝试为其自己的post_control
创建新的$model
,依此类推,直至永恒...
答案 2 :(得分:-1)
$classname
为post_control
,而非post_model
。您以递归方式调用构造函数。无限递归会消耗所有可用内存,从而产生致命错误。