【问题标题】:Scope management in codeigniter's template systemcodeigniter 模板系统中的范围管理
【发布时间】:2012-05-01 22:11:32
【问题描述】:

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

【问题讨论】:

  • 它们只是在方法的范围内(例如view()
  • @DamienPirsy 感谢您的回答。正是我想要的。

标签: php codeigniter include scope


【解决方案1】:

它确实使用了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 内类。

【讨论】:

  • 感谢您提供详细信息。包含文件使用包含它们的函数范围的事实是我需要的提示。
【解决方案2】:

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

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

包含在方法中不会与全局范围发生冲突: How to use include within a function?

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多