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

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

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

<?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() 将变量导入当前作用域的符号 table。因此,"extracted" 变量可从 render() 方法中获得。

PHP docs on extract:

Import variables from an array into the current symbol table.

这里的重点是current.

这个词

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

PHP docs state:

When a file is included, the code it contains inherits the variable scope of the line on which the include occurs. Any variables available at that line in the calling file will be available within the called file, from that point forward. However, all functions and classes defined in the included file have the global scope.


您在包含文件中引入的变量也将仅在当前范围内可用。但是函数和 类 不会。它们将驻留在全局范围内。


Will the view share the same symbole table as the contoller?

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