使用extract()以phpmvc模式将参数从控制器传递到视图


Passing parameters from controller to a view in a php mvc pattern using extract()

我试图理解phpMVC教程,但我不明白如何使用extract();(参见下面的Controller类)将它们添加到Controller类的函数render()内的符号表中(我不知道它的作用域是什么),然后在同一函数上调用require($view)函数以显示视图,在该视图中,这些提取的变量将可以简单地使用<?php echo $var; ?>进行调用。对我来说,这些提取的变量将仅在提取它们的函数内部本地可用(这意味着render()函数)。是否因为require函数是在同一级别调用的,所以这些提取的变量将在视图中可用?视图是否与控制器共享相同的符号表?还是将这些变量设置为全局范围?

<?php
class Controller{
    public $request;
    public $vars = array();
    function __construct($request){
        $this->request = $request;
    }
    public function render($view){
        extract($this->vars);
        $view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view.'.php';
        require($view); 
    }
    public function set($key,$value=null){
        if(is_array($key)){
                $this->vars += $key;
        }else{
                $this->vars[$key] = $value;
        }
    }

}
?>

PagesController.php,其中将调用render()函数:

<?php
class PagesController extends Controller{
        function view($nom){

            $this->set(array('phrase' => 'Salut ',
                             'nom' => 'Bohh')   
            );
            $this->render('index2');
        }
}
?>

extract()将变量导入到当前作用域的符号表中。因此,"提取的"变量可从render()方法中获得。

PHP文档摘录:

将数组中的变量导入到当前符号表中。

这里的重点是单词当前


变量在required文件中可用的原因是,所有关于包含的语言构造都继承了文件所在位置的范围。

PHP文档状态:

当包含一个文件时,它所包含的代码将继承发生包含的行的变量范围。从那时起,调用文件中该行可用的任何变量都将在被调用文件中可用。但是,包含文件中定义的所有函数和类都具有全局作用域。


在包含的文件中引入的变量也只能在当前范围内使用。然而函数和类不会。它们将存在于全球范围内。


视图是否与控制器共享相同的符号表?

在您的情况下,它将使用控制器的符号表render()方法。