我试图理解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()
方法。