已达到最大嵌套级别100,正在中止!-PHP

已达到最大嵌套级别100,正在中止!-PHP,php,class,Php,Class,致命错误:已达到最大函数嵌套级别“100”,正在中止!在第4行的C:\wamp\www\int\system\core\Controller.php中 Call Stack # Time Memory Function Location 1 0.0004 364608 {main}( ) ..\index.php:0 2 1.0350 433152 Bootstrap->__construct( ) ..\index.php:11 3 1.03

致命错误:已达到最大函数嵌套级别“100”,正在中止!在第4行的C:\wamp\www\int\system\core\Controller.php中

Call Stack
#   Time    Memory  Function    Location
1   0.0004  364608  {main}( )   ..\index.php:0
2   1.0350  433152  Bootstrap->__construct( )   ..\index.php:11
3   1.0355  438536  Welcome->__construct( ) ..\Bootstrap.php:7
4   1.0355  438536  Controller->__construct( )  ..\welcome.php:4
5   1.0356  438680  View->__construct( )    ..\Controller.php:4
6   1.0356  438680  Controller->__construct( )  ..\View.php:4
错误行:

<?php
class Controller {
    function __construct() {
        $this->view = new View(); // Error starts here
        $this->model = new Model();
        $this->tpl = new Template();
        $this->input = new Input();
        $this->lib = new Library();
        $this->session = new Session();
    }
}
?>
在模型中:

function __get($key)
{
    $fw =& Controller::get_instance();
    return $fw->$key;
}

这是因为
View
的构造函数调用
Controller
的构造函数,反之亦然。您需要重构代码以删除循环引用

我个人认为没有理由认为视图需要创建控制器,甚至不需要了解控制器。控制流应该是单向的:从控制器到视图

如果需要将控制器的功能注入视图,可以为其分配回调。像这样:

class Controller {

    function __construct() {
        $this->view = new View();
        $this->view->setFooFunction(function() {
            // do some stuff
        });
        echo $this->view->render();
    }

}


class View {

    protected $foo_function;

    public function __construct() {
        // ... no controller required :)
    }

    public function setFooFunction(Closure $function) {
        $this->foo_function = $function;
    }


    public function render() {
        $this->foo_function->__invoke();
        ... 
    }

}

这是因为
View
的构造函数调用
Controller
的构造函数,反之亦然。您需要重构代码以删除循环引用

我个人认为没有理由认为视图需要创建控制器,甚至不需要了解控制器。控制流应该是单向的:从控制器到视图

如果需要将控制器的功能注入视图,可以为其分配回调。像这样:

class Controller {

    function __construct() {
        $this->view = new View();
        $this->view->setFooFunction(function() {
            // do some stuff
        });
        echo $this->view->render();
    }

}


class View {

    protected $foo_function;

    public function __construct() {
        // ... no controller required :)
    }

    public function setFooFunction(Closure $function) {
        $this->foo_function = $function;
    }


    public function render() {
        $this->foo_function->__invoke();
        ... 
    }

}


我假设你的一个循环坏了…找出视图构造函数试图构造控制器的原因。你的
视图
控制器
之间有一个循环引用。我需要它能够将$this->View、$this->model等连接到视图和模型中。视图+模型控制器(以及该文件中的所有其他控制器)不扩展控制器,但我希望能够在视图/模型中使用它们,因此我尝试扩展控制器,我知道它不想玩得很好。正如其他人所建议的,这是一个设计问题。你考虑过其他的方法吗?很明显,您遇到了一堵墙,为什么不直接从等式中删除这堵墙呢?我假设您的一个循环坏了……找出视图构造函数试图构造控制器的原因。您的
视图
控制器
之间有一个循环引用。我需要它来连接$this->视图,将$this->model等转换为视图和模型。视图+模型控制器(以及该文件中的所有其他控制器)不扩展控制器,但我希望能够在视图/模型中使用它们,因此我尝试扩展控制器,我知道它不想玩得很好。正如其他人所建议的,这是一个设计问题。你考虑过其他的方法吗?很明显,您遇到了一堵墙,为什么不直接从等式中删除这堵墙呢?它背后的要点是能够从内部视图和模型中使用$this->view、$this->model等等。它在控制器中工作良好,只是不在视图/模型中。如果您的模型与视图通信,则您会遇到严重的设计问题。事实并非如此,但我希望能够调用控制器定义的$this->{method},例如库、输入、会话等。您需要从
视图中删除
新控制器()
:\uu construct()
我确实删除了它,但是我如何调用$this->input?例如,它背后的要点是能够从内部视图和模型中使用$this->View、$this->model等。它在控制器中工作良好,只是不在视图/模型中。如果您的模型与视图通信,则您会遇到严重的设计问题。事实并非如此,但我希望能够调用控制器定义的$this->{method},例如库、输入、会话等。您需要从
视图中删除
新控制器()
:\uu construct()
我确实删除了它,但是如何调用$this->input呢?