【发布时间】:2016-05-23 22:45:59
【问题描述】:
我知道这很愚蠢,但我想不通。 我在 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()); 表明 site_init.php 在 require_once 之前包含,所以我不必再 require(_once) 它。
它必须与变量范围有关。如果我使用global $siteVars,它可以工作,不需要再次require 文件,但是有人可以解释为什么会发生这种情况吗?我是 CodeIgniter 的新手。我可以看到只有一个入口点(主 index.php 文件),那就是基本文件($_SERVER['PHP_SELF'])。
理想情况下,我还想知道如何在不使用global 或require 的情况下解决此问题。
更新: 文件结构似乎如下(这是一个我只是在做的项目,我不是最初的开发者):
控制器
welcome.php在 CodeIgniter 应用程序文件夹结构(CI 应用程序是更大站点的管理部分)之外加载(包含一次)文件 X。文件 X 包含一次
site_init.php文件控制器
welcome.php加载视图$this->load->view('template', $data);差不多就是这样。希望这是解决问题的关键。
【问题讨论】:
-
stackoverflow.com/a/2418514/3599549。该页面之前是否已包含在内?
-
奇怪,我在这里测试了 2 个文件,使用了 require 和 require_once,两次都成功了。我能够打印变量的内容。
-
你的 php 版本是多少?我觉得codeigniter与此无关。似乎是命名空间问题,但这样说很奇怪......
-
我在问题中链接到的问题解释说它与范围有关,@987654343@ 解决了这个问题的事实证明这是一个范围问题。你是如何测试的,你有codeigniter安装吗?我也应该给你我的文件夹结构,这样你就可以复制了。
-
imo,很明显你的
site_init.php被执行在错误的地方。它需要在顶级脚本(index.php?)上执行,而不是从 CI 中的任何地方执行。目前$siteVars变量是going out of scope并在创建后不久被删除;-/ 如何解决它。 1)将脚本移动到顶层; 2) 将SiteVars声明为singleton类。 3) 将其分配为 CI 框架的属性?即$this->siteVars = array();等。
标签: php codeigniter