2016-02-12 60 views
0

我知道这是愚蠢的,但我无法弄清楚。 我在MVC框架的上下文中发现了一些类似的questions。 这就是我的情况,因为我使用的是CodeIgniter。变量作用域:require_once不加载我的变量,但是需要做的事

我有一个文件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());显示site_init.php被包含在require_once之前,所以我不应该再次需要(_once)它。

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

理想情况下,我也想知道如何解决这个问题,而不使用globalrequire

UPDATE: 文件结构似乎是以下(这是一个项目,我只是工作,我不是原来的开发商):

  • 控制器welcome.php负载(include_once)的文件X在CodeIgniter应用程序文件夹结构之外(CI应用程序是较大站点的管理员部分)。

  • 文件X include_once site_init.php文件

  • 控制器welcome.php负荷的观点$this->load->view('template', $data);

  • 这是相当多了。希望这是解决方案的关键。

+0

http://stackoverflow.com/a/2418514/3599549。页面早已包含在内吗? – Krii

+0

很奇怪,我在这里用2个文件测试过,使用require和require_once,两次都成功了。我能够打印变量的内容。 –

+0

什么是你的PHP版本?我觉得Codeigniter与此无关。看起来像一个命名空间问题,但它很奇怪,所以说...... –

回答

1

在CodeIgniter中,唯一可以在视图中访问的变量从控制器传递给它。永远不应该有一个理由,包括在笨这样任何

控制器:

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

查看:

<?php print $title;?> 

看到配置类http://www.codeigniter.com/user_guide/libraries/config.html的可能,然后在访问自定义配置值控制器并传递到视图

+0

谢谢Matt,我认为你的答案是解决方案的关键。如果我设法做到,我会更新。 – bg17aw

+0

嗨马特,我用更多的信息更新了这个问题,你可以看看,也许它可以帮助你更确定问题是什么? – bg17aw

+0

@ bg17aw I因此,您可以访问控制器welcome.php中的变量,但不能访问视图中的变量? –

0

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

print_r(get_included_files());显示site_init.php放在require_once之前被包括在内,所以我不应该再有要求(_once)它。

这是说你已经列入该文件之前,所以require_once()当你再次尝试它没有做任何事情。这不是require_once()“不加载你的变量”,它只是做它应该做的 - 避免包含你已经加载的文件。
显然,require()不关心这种情况,它重新包括脚本,因此在当前范围内导入该变量。

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

+0

你只是在重新编写我自己的陈述,我已经知道我完全意识到这个文件已经包含在内,并且require_once没有做任何事情。但是,我不认为在站点范围内包含init文件是一个坏主意,因为init文件只保存了'debug'开关,根路径以及类似的东西。就像WordPress中的wp-config.php文件一样。 – bg17aw

+0

你是不是在问*为什么*它什么都不做?这就是我解释的。 – Narf

+0

我可能会错过一些东西,我看不出你是如何回答这个问题的。如果您阅读了我所链接的类似问题的答案,那么在正确的方向上有一个好的方面,因为这与MVC框架结构有关。 – bg17aw