我知道这是愚蠢的事,但我无法弄明白。 我在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 manual:Like 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']
)。
理想情况下,我还想知道如何在不使用global
或require
的情况下解决此问题。
更新 文件结构似乎如下(这是我正在处理的项目,我不是原始开发人员):
controller welcome.php
在CodeIgniter app文件夹结构外部加载(include_once)文件X(CI app是较大站点的管理员部分)。
文件X include_once site_init.php
文件
控制器welcome.php
加载视图$this->load->view('template', $data);
这就是它。希望这是解决问题的关键。
答案 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()
并不关心这个条件,它会重新包含脚本,因此会在当前范围内导入所述变量。
无论如何,一次又一次地包括脚本是将数据放入当前范围的可怕方法。您应该学习如何使用函数参数传递数据。