2012-07-30 31 views
2

有誰知道isset和empty是如何被翻譯者解釋的,或者翻譯者如何處理未定義的變量?常量,isset和空白評估

爲了擴大我的問題,我有下面的代碼在我的包含文件:

define('USER_AUTH', !empty($_SESSION['username']) && !empty($_SESSION['status'])); //user is verified 
define('ACC_IS_PENDING', $_SESSION['status'] == '0');//checks to see if user status is pending which has a status of 0 

USER_AUTH作爲一個快速的手,以檢查是否用戶進行身份驗證。 ACC_IS_PENDING用作賬戶狀態未決時的快捷手段。但是,PHP給了我一個通知,告訴我在我的第二行代碼中$ _SESSION ['status']是未定義的。我知道它是未定義的,但我還沒有使用它!你怎麼敢告訴我我已經知道的事情。英雄聯盟

然而,當我欺騙代碼與以下:

define('USER_AUTH', !isempty($_SESSION['username']) && !isempty($_SESSION['status'])); 
define('ACC_IS_PENDING', $_SESSION['status'] == '0'); 

其中的isEmpty()是一個定製的功能,將始終返回FALSE。然後沒有通知! 或者,如果我用下面的代碼:

define('USER_AUTH', notempty($_SESSION['username']) && notempty($_SESSION['status'])); 
define('ACC_IS_PENDING', $_SESSION['status'] == '0'); 

凡notempty()總是返回TRUE,然後再次沒有理會。

我說得對,翻譯員檢查變量是否已經過一次測試,並且如果測試結果爲真,那麼譯員將此視爲變量已被定義?

如果是這種情況,那麼isset和empty是什麼?無論評估是真是假,他們似乎都會通知我。

define('USER_AUTH', isset($_SESSION['username']) && isset($_SESSION['status'])); 
define('ACC_IS_PENDING', $_SESSION['status'] == '0'); 

define('USER_AUTH', empty($_SESSION['username']) && empty($_SESSION['status'])); 
define('ACC_IS_PENDING', $_SESSION['status'] == '0'); 

很抱歉沒能長篇大論的問題。這看起來微不足道,但如果有一個快速定義的常量而不需要通知,那將是很好的選擇!任何幫助解釋或更好的解決這種瑣碎的任務將不勝感激,謝謝!

+0

我忘了提及自定義函數附加了一個&以確保該變量通過引用傳遞。像這樣: 函數isempty(&$ var){...} – chaser 2012-07-30 11:53:45

+0

爲什麼不創建一個IF條件來定義某些東西?我認爲當它不是這樣的時候,它會使事情變得複雜。 – Gntem 2012-07-30 12:10:50

回答

1

PHP抱怨,因爲索引'狀態'沒有在數組中定義。你需要寫

!isset($_SESSION['status']) || empty($_SESSION['status'] 

當您的「絕招」的代碼所描述的,PHP將永遠不會嘗試訪問不存在的數組索引,這就是爲什麼你沒有得到任何通知。

在第四個代碼示例(使用isset)中,您仍然訪問第二行代碼中不存在的數組索引,所以我懷疑這就是爲什麼還有一個通知。

+0

實際上,即使變量不存在,empty()語言構造也不應該發出警告,按照http://www.php.net/manual上的文檔/en/function.empty.php,因此不需要使用isset()和empty()的雙重檢查。 – 2012-07-30 12:29:41

+0

@Andreas,感謝您的意見。你說關於欺騙PHP不要在不存在的數組索引中查找一下DUH!所以我去用我的代碼做更多的測試。因爲我想知道爲什麼第一行代碼(當被欺騙時)停止了第二行代碼的通知。我很困惑。 所以當我欺騙PHP時,它繼續前進,並將此變量定義爲null,所以在我第一次欺騙它之後,通知從來沒有回過來困擾我。 使用isset和空函數,它應該從來沒有以這種方式開始工作!感謝讓我意識到這一點。 – chaser 2012-07-30 12:45:38

1

a)如果你想用$ _SESSION [「狀態」],你必須先檢查該變量不爲空(見http://www.php.net/manual/fr/function.isset.php有詳細介紹):

if (isset($_SESSION['status'])) { 
    // here the value exists and can be used 
    Do something... 
} else { 
    // here the value does not exist and cannot be used 
} 

B)我認爲,

empty($_SESSION['username']) && !empty($_SESSION['status']) 

不是常數:它從一次跑到另一次跑。您可能想要使用

$user_is_logged = empty($_SESSION['username']) && !empty($_SESSION['status']); 

並使用變量$ user_is_logged而不是常量。有關常量的詳細信息,請參見本節http://www.php.net/manual/fr/language.constants.php

+0

感謝您的意見。我非常困惑,因爲我認爲第一行代碼和第二行代碼之間存在關係(請參閱我的其他評論)。當我欺騙第一行代碼時,它停止了第二行代碼的通知。因此,我的困惑。我現在知道這與常量無關,而是PHP如何以自上而下的方式解釋我的代碼。看,我認爲常量是在被引用時評估的。但是這不是真的,只要PHP到達代碼就會被評估。日Thnx! – chaser 2012-07-30 12:57:38

+0

如果你想在寫一個常量時被評估,那麼我認爲一個函數是一個交易。 – 2012-07-30 14:55:25

+0

感謝堆,功能似乎是一個更好的主意:) – chaser 2012-07-31 01:17:51