2009-10-21 72 views
5

這應該工作,所以我真的很困惑,爲什麼它不工作。將PHP變量傳遞給包含的文件?

我正在檢查用戶是否使用每個管理頁面頂部的$ session類方法登錄。但是,我想根據用戶是否已登錄以及該用戶擁有哪個角色級別來動態調整頭文件。

所以我檢查$session->is_logged_in(),然後我繼續定義的變量稱爲$logged = true;稍後使用。然後我使用$user->find_by_id($session->id)方法創建一個新的User對象,並將$user->role_level存儲在名爲$role_level的新變量中以便於使用。

這一切都發生在頁面頂部附近。在表單處理等頁面的下一頁,是include("../_layouts/header.php")命令。然後,在header.php文件中,我使用諸如if(!$logged) { ... } else { ... }之類的小檢查。然而...

我收到以下錯誤:

Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 119 
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 131 
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 138 

怎麼能這樣呢?在包含header.php之前,我正在定義文件中的變量!不應該那樣工作?

僅供參考,一切工作正常,直到我試圖在header.php文件中使用$logged

+1

'$ logged'是否在每種情況下都設置?代碼中沒有可能無法設置的方法? 如果您在腳本的頂部(定義之前)添加了'$ logged =「」;',會發生什麼? – 2009-10-21 14:54:07

+0

它發生在我身上的一次,我在一個函數中包含了一個文件。除非您將變量作爲參數傳遞或用全局方式定義它們,否則它們在包含的文件中不可用。只是一個珍聞。 – nalply 2012-08-20 20:31:27

回答

4

變量會傳播到包含的文件,因此它必須是,當您調用include時,變量不會被設置:如果是,請嘗試檢查,然後找出爲什麼該變量未在該點設置。例如,如果在「if」塊內部或在函數內部定義了$記錄,則它不會傳播到其外部:您必須在最外層範圍內定義它(與您調用的同一級別包含聲明)。而且,您必須爲用戶未登錄的情況下定義它,而不僅僅是用戶登錄時的情況。如果變量未初始化爲false,則檢查(!$ logged)是否會發出警告。說$ logged = false;在你工作的開始。

+0

感謝你們倆。 $ logged變量在文件的頂部被設置爲$ logged = false; - 這很混亂。 – rhodesjason 2009-10-21 15:27:31

+0

它一定是某種小故障,因爲它現在正在工作。感謝大家。 – rhodesjason 2009-10-21 15:56:48

1

嘗試東西很簡單,就像

// file1.php 
$var = "foobar"; 

// file2.php 
include("file1.php"); // or require("file1.php"); 
die($var); 

是否行得通?也許這是你代碼之外的問題。

1

只是一個意見......而不是包括代碼全局空間執行,並根據另一全局變量被定義,包括文件的地方,並有內部的header.php的代碼被組織到相應的功能。然後在你想從header.php輸出的地方,用$ logged作爲參數調用適當的函數。這將有助於使代碼更具內聚性,更易於測試(如單元測試)。

+0

我不確定我關注,但我對你的評論很感興趣。我將用戶數據存儲在會話中,因此我只需要能夠根據用戶的角色/權限更改標題HTML。當header.php似乎無法調用$ session變量時,我試着聲明$ logged。看起來有一個小故障阻止我做任何一個,所以我現在可以回到剛纔調用$ session->等等。你在暗示什麼? – rhodesjason 2009-10-21 21:04:23

+0

這與你可能遇到的任何問題都沒有什麼關係,但更多地涉及到將全局代碼放入其中的常見做法(意味着代碼不在任何函數內),並將該文件包含在所需的位置輸出顯示在頁面中。我所建議的是,你將這些代碼包裝在一個函數中。代替該文件中使用預期將在包含頁面中定義的變量的代碼,您可以稍微重寫它,以便代碼使用該函數的參數。然後,您可以將該文件包含在頁面頂部(或任何位置)並調用它。 – grantwparks 2009-10-27 04:15:18

+0

...所以你可能有'函數getPageHeader($ bIsLoggedIn){做的東西基於$ bIsLoggedIn並返回HTML作爲一個字符串; }'。您希望輸出顯示的位置可以'echo getPageHeader($ logged);'。這將使代碼與全局變量等分離,並使其可重複使用並可單元測試。它更安全,不太可能被打破。 – grantwparks 2009-10-27 04:18:46

1

相反的if (!logged),嘗試if (empty($logged))。如果變量尚未設置,那麼不會生成通知。