Php 需要父控制器查看时未定义变量

Php 需要父控制器查看时未定义变量,php,model-view-controller,undefined,controllers,Php,Model View Controller,Undefined,Controllers,我使用的是控制器和视图(没有框架),需要父控制器的视图时遇到问题,这会导致变量未定义 有一个带有视图功能的主控制器,它不需要视图 class Controller { public function view($view, $data =[]){ require_once './app/views/' . $view . '.php'; } 然后有一个用户控制器扩展了控制器,它使用一个方法“mypage”加载变量中的内容并需要一个视图

我使用的是控制器和视图(没有框架),需要父控制器的视图时遇到问题,这会导致变量未定义

有一个带有视图功能的主控制器,它不需要视图

class Controller {
    public function view($view, $data =[]){                  
    require_once './app/views/' . $view . '.php';
}    
然后有一个用户控制器扩展了控制器,它使用一个方法“mypage”加载变量中的内容并需要一个视图。(如果登录,您可以在URL中访问Mypage)

$this->view('mypage')启动父控制器中的view方法,该方法需要使用变量的mypage视图(mypage.php)。问题是mypage.php中的所有变量都未定义

如果我和你交换那条线路

require_once "./app/views/mypage.php";    

,然后它就工作了。那么,为什么在需要控制器时会丢失变量?我做错了什么?

胡乱猜测,但我认为这是一个范围问题:

您正在
mypage()
函数中定义变量,因此这些变量只存在于该函数的作用域中。 调用
$this->view(…)
只会调用另一个有自己作用域的方法(变量不存在的地方)


而当您直接调用
require\u once(…)
时,包含的视图脚本将继承当前范围中已定义的变量。

您是否需要类用户页中的类控制器?在用户类中,我有一个自动加载器:spl\u autoload\u register(函数($class){require\u once./app/controllers/”。($class)。“.php”;});我想这是一个范围问题,但我如何使其工作?或者控制器不需要需要视图?@Galivan:您需要找到一种方法将值传递给视图脚本。例如,您可以在控制器中使用关联数组或stdClass对象,其中键将是变量名称(和值…值)并将其作为第二个参数传递给
$this->view(…)
方法函数并使用该函数。别忘了添加适当的转义!好的,我明白了!但这似乎是一个不必要的迂回。我只是想让事情变得更有效,我还在学习。也许我会使用“require”来自用户类。@Galivan:如果您试图探索MVC模式,您必须创建一些表示视图的内容。可以是一个视图对象,它将保存您需要显示的值。请参阅我找到的示例:感谢链接。我目前没有使用“模型”(尽管我有一个),也许这是缺少的部分。我已经看过很多教程,但没有看到很多关于显示网页和一些变量的示例。但是我会看看链接。
require_once "./app/views/mypage.php";