我們在使用php開發(fā)過程中,經(jīng)常會遇到defined函數(shù),這個函數(shù)的作用是檢查某個常量是否被定義。但是有些常量卻是被defined函數(shù)判定為未定義,這是為什么呢?下面我們就來探討一下php中defined函數(shù)的解密。
在php中,我們使用define()函數(shù)可以定義常量,比如:
define('APP_NAME', 'MyApplication');
這樣我們就定義了一個名為APP_NAME,值為"MyApplication"的常量。如果我們要檢查這個常量是否被定義,可以使用defined函數(shù)來判斷。
if (defined('APP_NAME')){ echo "常量已經(jīng)定義"; }else{ echo "常量未被定義"; }
這個代碼輸出的結(jié)果應(yīng)該是“常量已經(jīng)定義”。也就是說,我們在使用defined函數(shù)時,如果檢測的常量確實已經(jīng)被define函數(shù)定義了,那么結(jié)果就是true。
但是,有時候我們會遇到這種情況:
if (defined('MY_CONST')){ echo "常量已經(jīng)定義"; }else{ echo "常量未被定義"; }
而此時我們明明已經(jīng)定義了這個MY_CONST常量,但是檢查結(jié)果卻是false。這是為什么呢?
答案就在defined函數(shù)的參數(shù)中。如果我們在defined函數(shù)中傳入的參數(shù)是一個常量,那么判斷的結(jié)果是這個常量是否已經(jīng)被定義。但是如果我們傳入的參數(shù)是一個字符串,那么php會嘗試找到這個字符串所對應(yīng)的常量,然后再檢測這個常量是否被定義。
比如,我們先定義一個常量:
define('MY_CONST', 'Hello, world!');
然后再使用defined函數(shù)來檢測這個常量:
if (defined(MY_CONST)){ echo "常量已經(jīng)定義"; }else{ echo "常量未被定義"; }
這里我們沒有在常量名前加上單引號或者雙引號,但是php會自動將其識別為一個常量名,而不是一個普通的字符串。運行結(jié)果是“常量已經(jīng)定義”。
如果我們將defined函數(shù)中的參數(shù)改成一個常量的名字字符串:
if (defined('MY_CONST')){ echo "常量已經(jīng)定義"; }else{ echo "常量未被定義"; }
這個時候運行結(jié)果依然是“常量已經(jīng)定義”,因為php會先把'MY_CONST'字符串轉(zhuǎn)換成常量MY_CONST,再進行defined函數(shù)的判斷。
綜上,在使用php中的defined函數(shù)時,如果我們傳入的參數(shù)是常量的名字字符串,php會自動將這個字符串轉(zhuǎn)換成常量,然后再判斷該常量是否被定義。如果我們傳入的是一個常量,php會直接判斷該常量是否被定義。
因此,如果我們要使用defined函數(shù)來檢測一個常量是否被定義,最好還是將常量名放在單引號或者雙引號中,以避免出現(xiàn)不必要的錯誤。