2015-01-12 83 views
5

我在許多地方(數以千計的地方)在我的項目下面的代碼:PHP的:寫一個返回值或空isset功能

$foo = isset($mixed) ? $mixed : null; 

哪裏$mixed可以是任何東西:數組,數組元素,對象,對象屬性,標量等。例如:

$foo = isset($array['element']) ? $array['element'] : null; 
$foo = isset($nestedArray['element']['key']) ? $nestedArray['element']['key'] : null; 
$foo = isset($object->prop) ? $object->prop : null; 
$foo = isset($object->chain->of->props) ? $object->chain->of->props : null; 

有沒有辦法將這個重複的邏輯寫成一個(簡單)函數?例如,我試過:

function myIsset($mixed) 
{ 
    return isset($mixed) ? $mixed : null; 
} 

上面的函數看起來好像會起作用,但實際上並沒有。例如,如果$object->prop不存在,並且我打電話給myIsset($object->prop)),那麼在函數被調用之前,我會收到致命錯誤:Undefined property: Object::$prop

關於如何編寫這樣一個函數的任何想法?它甚至有可能嗎?

我意識到一些解決方案已發佈herehere,但這些解決方案僅適用於陣列。

+3

我不認爲你可以更有效地做到這一點。相反,我會盡量減少你使用它的次數,*千*似乎太多了。我猜想整個變量塊都是設置或不設置的,因此檢查一個變量可以給你設置各種變量的機會。 – jeroen

+2

@jeroen如果你經常需要經常檢查這個問題,那麼這是一種「代碼味道」 –

回答

7

我在閱讀php references時偶然發現了自己的問題的答案。我的解決方案如下:

function issetValueNull(&$mixed) 
{ 
    return (isset($mixed)) ? $mixed : null; 
} 

調用該函數現在看起來像:

$foo = issetValueNull($array['element']); 
$foo = issetValueNull($nestedArray['element']['key']); 
$foo = issetValueNull($object->prop); 
$foo = issetValueNull($object->chain->of->props); 

希望這有助於人在那裏尋找一個類似的解決方案。

+0

這是一個了不起的發現!感謝您發佈這個! –

0

其實你可以只寫它想:

$foo = $mixed?:null; 
+1

不,如果沒有設置'$ mixed',會產生警告。 – jeroen

+0

它會生成一個通知。而且您沒有任何業務在生產環境中顯示通知或警告。 –

+0

如果您正在編寫這樣的代碼,那麼您可能會忽略整個三元表達式,因爲未設置的變量計算結果爲NULL。 – jeroen

-2

如果你只是要檢查是否存在這樣做

function myIsset($mixed) 
{ 
    return isset($mixed); // this is a boolean so it will return true or false 
} 
+1

爲什麼寫一個只返回全局函數結果的函數?語義? – Leo

+1

我同意這是多餘的。 – Rafael

2

isset是一個語言結構,而不是常規的函數。因此,它可以採取會導致錯誤的內容,並返回false。

當您致電myIsset($object->prop))時,評估發生,您會收到錯誤消息。

http://php.net/manual/en/function.isset.php

這是同樣的問題在JavaScript中使用typeof nonExistentVariabletypeof是一種語言結構,不會導致錯誤。

但是,如果您嘗試創建函數,則會嘗試使用未定義的變量時出現錯誤。

function isDef(val) { 
    return typeof val !== 'undefined'; 
} 

console.log(typeof nonExistent !== 'undefined'); // This is OK, returns false 
isDef(nonExistent); // Error nonExistent is not defined 
-1
function f(&$v) 
{ 
    $r = null; 

    if (isset($v)) { 
     $r = $v; 
    } 

    return $r; 
}