2011-05-12 131 views
75

我喜歡在Perl中做這樣的事情:$foo = $bar || $baz$baz設置爲$foo如果$bar爲空或未定義。您還有$foo ||= $bletch,如果$foo未定義或爲空,則只會將$bletch指定給$foo爲變量賦予默認值的最佳方式(模擬Perl ||,|| =)

這種情況下的三元運算符是單調乏味的。當然,PHP中有一個簡單而優雅的方法?

或者是使用isset()的自定義函數的唯一答案?

+0

有關[Codereview。SE]:http://codereview.stackexchange.com/q/12722/31433 – Palec 2015-08-08 01:28:41

+1

順便說一句,具有所需功能的Perl運算符是'//'和'// =',它們自Perl v5.10.0起存在。最初的'||'和'|| ='測試邏輯值,而不是定義。 – Palec 2015-08-08 01:33:14

+0

@Palec,爲什麼要將一個有29個upvotes的4年老問題確定爲6個upvotes(其本身被標記爲另一個問題的副本)的1年期問題的副本?我認爲這有很大的價值這個問題,因爲標題更通用(不引用答案,即:isset())。 – 2015-08-10 17:24:39

回答

154

PHP 5.3有個縮寫?:操作:

$foo = $bar ?: $baz; 

哪個分配$bar如果它不是空值(我不知道如何做到這一點在PHP Perl的不同),否則$baz,並與此相同的Perl和舊版本的PHP:

$foo = $bar ? $bar : $baz; 

但PHP不具有這樣的複合賦值操作符(也就是沒有Perl的||=的當量)。

此外,如果沒有設置$bar,PHP會發出噪音,除非您關閉通知。 isset()empty()之間也有語義上的差異。如果變量不存在或者設置爲NULL,則前者返回false。後者如果不存在則返回true,或者設置爲0''falseNULL

+2

+1爲了向我介紹5​​.3的另一個強大功能,我錯過了RHEL5/PHP5.1.2服務器。 – 2011-05-12 02:10:54

+0

我想你的意思是在倒數第二句中,「第一個返回」而不是「第二個」。 – Toto 2011-05-12 08:16:56

+12

請注意,如果您的變量未定義,PHP將會發出通知。很遺憾,這不是'$ var = isset($ var)的替代品嗎? $ var:'默認值';'它說在答案中...只是指出任何撇棄它的人。 :-D – Brad 2014-06-02 15:00:00

7

一個常見成語留在舊的PHP版本兼容是:

$var = $bool or $var = "default"; 
// If I use it, then only with excessive spaces for clarity. 

這適用於可以在布爾上下文中的評估值。這裏的優點是它也給你說調試e_notice如果變量是未定義的。

+0

是不是用'$ bool? $ bool:「default」'如果'$ bool'未定義? – BoltClock 2011-05-12 02:03:10

+0

當然,這是一樣的。我認爲OP是指'isset($ var)? $ var:DEFAULT'。但無論如何,他聽起來像是想避開它們。 – mario 2011-05-12 02:05:46

7

感謝您的所有偉大的答案!

對於任何人來這裏尋找可能的替代方案,這裏有一些功能可以幫助緩解這類事情。

function set_if_defined(&$var, $test){ 
    if (isset($test)){ 
     $var = $test; 
     return true; 
    } else { 
     return false; 
    } 
} 

function set_unless_defined(&$var, $default_var){ 
    if (! isset($var)){ 
     $var = $default_var; 
     return true; 
    } else { 
     return false; 
    } 
} 

function select_defined(){ 
    $l = func_num_args(); 
    $a = func_get_args(); 
    for ($i=0; $i<$l; $i++){ 
     if ($a[$i]) return $a[$i]; 
    } 
} 

例子:

// $foo ||= $bar; 
set_unless_defined($foo, $bar); 

//$foo = $baz || $bletch 
$foo = select_defined($baz, $bletch); 

我敢肯定,這可以改進。

50

在PHP 7中,我們終於有辦法優雅地做到這一點。它被稱爲Null coalescing operator。您可以使用它像這樣:

$name = $_GET['name'] ?? 'john doe'; 

這相當於

$name = isset($_GET['name']) ? $_GET['name']:'john doe'; 
+7

爲了讓操作員使用最令人討厭,最酷的名字, – 2016-04-22 19:17:20

+5

我認爲[飛船運營商](http://php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op)也有優點。 – Mariano 2017-06-11 05:41:55

1

在PHP中早於7 *,可以使用:用於與@局部地抑制未定義具有可變錯誤:

$foo = @$bar ?: $baz;