2011-12-20 27 views
5

我有PHP的三元運營商的問題,因爲PHP版本5.3,你可以較新的風格PHP三元操作已經令人失望的結果與isset功能

// Older version 
$route = isset($test) ? $test : 'test is NOT set'; 


// Newer version as of 5.3 
$route = isset($test) ?: 'test is NOT set'; 

現在與一個更短的版本替換速記三元運算符如果未設置$test,則爲新版本。它工作正常。但是,如果因爲isset()方法而設置,則返回true1而不是該值。

是否必須使用較舊的較長方法才能使$route等於$test的值而不是布爾值1

+0

你可以使用'$路線= $測試:?測試未設置';'來代替。 – FtDRbwLXw6 2011-12-20 03:16:29

+1

如果你不介意壓制錯誤消息,你仍然可以使用速記。這不是'正確'或'漂亮'的方式,但仍然有效 - $ route = @ $ test?:'test is not set'; – 2013-09-24 20:53:34

回答

9

您必須使用更長的版本。

引述docs

表達表達式1:如果expr1的值爲TRUE,而表達式3否則expr3返回值爲表達式1。

因此,您的簡寫版本的正確行爲是返回評估結果isset($test)。根據需要,不是$test

1

PHP 7開始,您可以使用空合併運算符

$route = $test ?? 'test is NOT set'; 

這相當於

$route = isset($test) ? $test : 'test is NOT set'; 

Here你可以找到一些細節:

null合併操作員(??)已被添加爲需要使用三元組以及isset()的常見情況下的語法糖。它返回它的第一個操作數,如果它存在並且不是NULL;否則返回第二個操作數。