2016-02-12 64 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