2012-11-29 73 views
18

在PHP中我發現自己寫的代碼像這樣頻繁:如果分配變量設置

$a = isset($the->very->long->variable[$index]) 
      ? $the->very->long->variable[$index] 
      : null; 

有沒有一種簡單的方法來做到這一點?最好不要求我寫兩次$the->very->long->variable[$index]

+0

通過工作OOP和使用__get和__set? –

+0

@DaHaKa:這可能會在設置良好的服務器上發出警告('E_STRICT | E_ALL)' –

+0

如果您經常使用相同的long變量,則可以使用引用:'$ ref = $ the-> very->長>變量; $ a =!empty($ ref [$ index])? $ ref [$ index]:null; $ b =!empty($ ref [++ $ index])...',或者@Bondye指出的那樣,使用神奇的getter方法,並將其設置爲返回_either_ null或屬性值 –

回答

10

可悲的是,因爲RFC已被拒絕。由於isset不是函數,而是語言結構,所以不能爲這種情況編寫自己的函數。

注意:由於這是一種語言結構而不是函數,因此無法使用變量函數調用它。

+1

確實很傷心。但謝謝你的答案。 – oz1cz

1

假設你知道$the->very->long->variable設置,而你只是擔心數組索引....

$x = $the->very->long->variable; 
$a = isset($x[$index]) ? $x[$index] : null; 

或爲一個更通用的變種,你可以用你身邊代碼:

function array_valifset($arr,$k, $default=null) { 
    return isset($arr[$k]) ? $arr[$k] : $default; 
} 

然後調用它像這樣對於任何數組值:

$a = array_valifset($the->very->long->variable,$index); 
+0

謝謝。我希望我只是忽略了一個內置的功能。顯然情況並非如此。 – oz1cz

+0

不。正如@eisberg所說,PHP開發人員明確拒絕了速記isset解決方案。 :-(我相信他們有他們的理由 – SDC

-1

我偶然發現了同樣的問題,並發現引用數組元素不會發出通知或警告,但會返回null(至少PHP 5.6)。

$foo = ['bar' => 1]; 

var_dump($bar = &$foo['bar']); // int 1 
var_dump($baz = &$foo['baz']); // null 

內的if語句:

if($bar = &$foo['bar']) { 
    echo $bar; 
} 
if($baz = &$foo['baz']) { 
    echo $baz; 
} 
23

的更新,因爲PHP 7而出現在是在這一點上改變遊戲規則;以前的答案大約是PHP 5.

PHP 7解決了這個問題。因爲你確實認爲用PHP編寫這個文件是很常見的,這絕對不是很優雅。

在PHP 7中出現了Null Coalesce Operator (RFC),這是isset三元條件的完美縮寫。

它的目標是取代這種類型的條件:

$var = isset($dict['optional']) ? $dict['optional'] : 'fallback'; 

到那個:

$var = $dict['optional'] ?? 'fallback'; 

更妙的是,空COALESCE運營商可鏈接:

$x = null; 
# $y = null; (undefined) 
$z = 'fallback'; 

# PHP 7 
echo $x ?? $y ?? $z #=> "fallback" 

# PHP 5 
echo isset($x) ? $x : (isset($y) ? $y : $z) 

空聚合運算符的行爲與isset()完全相同:主題變量的值取自:

  • 變量定義(存在)
  • 變量不爲空

只是爲PHP初學者注:如果您使用三元條件,但你知道的主題變量必然定義(但你想爲falsy值回退),還有的Elvis operator

$var = $dict['optional'] ?: 'fallback'; 

隨着貓王操作,如果$dict['optional']是一個無效的偏移或$dict是不確定的,你會得到一個警告E_NOTICE(PHP 5 & 7)。這就是爲什麼在PHP 5中,人們使用可怕的isset a? a:b表格,當他們不確定輸入。

+0

很好的工作@Morgan用一個新的答案更新這個!謝謝。 –

0

如果你只分配null代替非設置爲可變的,你可以使用:

$a = @$the->very->long->variable[$index];

@使得該指令拋出任何錯誤