新的$ variable和new my_model之间的区别是什么?

时间:2013-10-27 12:52:25

标签: php class variables

我一直在制作自己的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我认为这些方法在制定一个新的立场之间存在差异。

谢谢!

3 个答案:

答案 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)

在您的示例中,

$classnamepost_control,而非post_model。您以递归方式调用构造函数。无限递归会消耗所有可用内存,从而产生致命错误。