变量范围:require_once不加载我的变量,但需要

时间:2016-02-12 17:13:35

标签: php codeigniter

我知道这是愚蠢的事,但我无法弄明白。 我在MVC框架的上下文中发现了一些类似的questions。 这也是我的情况,因为我正在使用CodeIgniter。

我有一个文件questions.php(包含在视图中):

require_once '../site_init.php';

var_dump($siteVars);
// shows null and a Notice: Undefined variable: siteVars
// but the ABSPATH constant is showing as defined!
var_dump(ABSPATH);
// shows string 'c:\wamp\www\sitename'

require '../site_init.php';
var_dump($siteVars);
// correctly dumps the content of siteVars array

和一个文件site_init.php应该包含在任何地方,因为它保存我的站点范围的配置值:

if ( !defined('ABSPATH') )
        define('ABSPATH', dirname(__FILE__) . '/');

/** Site-wide sitevars */
$siteVars = array();

// set to true in develop environment
$siteVars['debug'] == false;

我知道The require_once statement is identical to require except PHP will check if the file has already been included, and if so, not include (require) it again但是,当我使用require_once时,我会收到Undefined variable: siteVars的通知,而使用require时,所有内容都按预期工作。但是,正如您在上面的代码中看到的那样,常量显示为已定义,尽管它们都在同一文件中定义。 PHP manualLike superglobals, the scope of a constant is global. You can access constants anywhere in your script without regard to scope.

print_r(get_included_files());显示在require_once之前包含了site_init.php,因此我不必再次要求(_once)。

它必须与变量范围有关。如果我使用global $siteVars,它可以工作,而不需要再次require该文件,但有人可以解释为什么会发生这种情况吗?我是CodeIgniter的新手。我可以看到只有一个入口点(主index.php文件),而且它是基本文件($_SERVER['PHP_SELF'])。

理想情况下,我还想知道如何在不使用globalrequire的情况下解决此问题。

更新 文件结构似乎如下(这是我正在处理的项目,我不是原始开发人员):

  • controller welcome.php在CodeIgniter app文件夹结构外部加载(include_once)文件X(CI app是较大站点的管理员部分)。

  • 文件X include_once site_init.php文件

  • 控制器welcome.php加载视图$this->load->view('template', $data);

  • 这就是它。希望这是解决问题的关键。

2 个答案:

答案 0 :(得分:1)

In CodeIgniter the only variables accessible in a view are passed to it from the controller. There should never be a reason to include anything in this way in COdeIgniter

Controller:

$d['title'] = 'title';    
$this->load->view('main',$d);

View:

<?php print $title;?>

see Config Class http://www.codeigniter.com/user_guide/libraries/config.html for custom config values which could then be accessed in the controller and passed on to the view

答案 1 :(得分:0)

这是一个逻辑问题,范围只是帮助您看到它。这是关键:

  

print_r(get_included_files());显示在require_once之前包含了site_init.php,因此我不必再次要求(_once)。

这表示您之前已经包含该文件,因此require_once()在您再次尝试时无法执行任何操作。这并不是require_once()&#34;不加载您的变量&#34;,它只是做它应该做的事情 - 避免包含您已经加载的文件。
显然,require()并不关心这个条件,它会重新包含脚本,因此会在当前范围内导入所述变量。

无论如何,一次又一次地包括脚本是将数据放入当前范围的可怕方法。您应该学习如何使用函数参数传递数据。