我喜歡在Perl中做這樣的事情:$foo = $bar || $baz
將$baz
設置爲$foo
如果$bar
爲空或未定義。您還有$foo ||= $bletch
,如果$foo
未定義或爲空,則只會將$bletch
指定給$foo
。爲變量賦予默認值的最佳方式(模擬Perl ||,|| =)
這種情況下的三元運算符是單調乏味的。當然,PHP中有一個簡單而優雅的方法?
或者是使用isset()的自定義函數的唯一答案?
我喜歡在Perl中做這樣的事情:$foo = $bar || $baz
將$baz
設置爲$foo
如果$bar
爲空或未定義。您還有$foo ||= $bletch
,如果$foo
未定義或爲空,則只會將$bletch
指定給$foo
。爲變量賦予默認值的最佳方式(模擬Perl ||,|| =)
這種情況下的三元運算符是單調乏味的。當然,PHP中有一個簡單而優雅的方法?
或者是使用isset()的自定義函數的唯一答案?
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
,''
,false
或NULL
。
一個常見成語留在舊的PHP版本兼容是:
$var = $bool or $var = "default";
// If I use it, then only with excessive spaces for clarity.
這適用於可以在布爾上下文中的評估值。這裏的優點是它也給你說調試e_notice如果變量是未定義的。
感謝您的所有偉大的答案!
對於任何人來這裏尋找可能的替代方案,這裏有一些功能可以幫助緩解這類事情。
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);
我敢肯定,這可以改進。
在PHP 7中,我們終於有辦法優雅地做到這一點。它被稱爲Null coalescing operator。您可以使用它像這樣:
$name = $_GET['name'] ?? 'john doe';
這相當於
$name = isset($_GET['name']) ? $_GET['name']:'john doe';
爲了讓操作員使用最令人討厭,最酷的名字, – 2016-04-22 19:17:20
我認爲[飛船運營商](http://php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op)也有優點。 – Mariano 2017-06-11 05:41:55
在PHP中早於7 *,可以使用:用於與@
局部地抑制未定義具有可變錯誤:
$foo = @$bar ?: $baz;
有關[Codereview。SE]:http://codereview.stackexchange.com/q/12722/31433 – Palec 2015-08-08 01:28:41
順便說一句,具有所需功能的Perl運算符是'//'和'// =',它們自Perl v5.10.0起存在。最初的'||'和'|| ='測試邏輯值,而不是定義。 – Palec 2015-08-08 01:33:14
@Palec,爲什麼要將一個有29個upvotes的4年老問題確定爲6個upvotes(其本身被標記爲另一個問題的副本)的1年期問題的副本?我認爲這有很大的價值這個問題,因爲標題更通用(不引用答案,即:isset())。 – 2015-08-10 17:24:39