代码点火器模板系统中的范围管理


Scope management in codeigniter's template system

在codeigniter模板中基本上是包含文件,模板输入由关联数组提供。 我猜codeigniter使用extract()来表示魔法的那部分,但是它如何防止这些变量弄乱全局范围呢? 还是我在包含文件中缺少具有可变范围的内容?

它确实使用了 extract()。虽然提取函数有一个不覆盖现有变量的选项,但默认情况下它会覆盖,CodeIgniter 使用此默认值。

由于视图表面上

是应用程序的最终终结点,并且不应使用除通过视图传递的变量之外的任何变量,因此这应该不会出现任何问题。但是,如果您希望捕获范围冲突,可以执行以下操作:

$foo = 'bar';
$data = array('foo' => 'baz');
foreach($data as $key => $val)
    if(isset($$key)) { /* throw fatal error */ }
$this->load->view($data);

为了以更技术化和更不实用的方式回答您的问题,上面的注释者是正确的:变量在_ci_load函数的方法范围内解析,在CI_loader类内。

与全局范围没有冲突,因为视图是在方法中加载的。

CodeIgniter 正在使用 extract() :https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Loader.php#L886

CodeIgniter 的代码包括一个视图:https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Loader.php#L910

包含在方法中不会导致与全局范围发生冲突:如何在函数中使用包含?