2009-08-08 108 views
18

此之下似乎並沒有工作,我怎麼會想到吧,雖然事件$ _GET [ 'friendid'] = 55它返回NULL簡單的PHP isset測試

<?PHP 

$_GET['friendid'] = 55; 

$friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

echo $friendid; 
exit; 

?> 
+5

應該呼應「空」,因爲你必須在三元表達式操作員倒退。 – 2009-08-08 13:21:39

回答

36

取出!。你不想否定表達。

$friendid = isset($_GET['friendid']) ? $_GET['friendid'] : 'empty'; 
+0

好的,但我不明白爲什麼會發生這種情況,$ _GET ['friendid'] ='';不顯示空的,不應該認爲這是一個空值? ' – JasonDavis 2009-08-08 13:37:11

+0

''是一個空字符串,但變量仍然設置。 – 2009-08-08 13:49:18

+4

這與吮吸無關,但事實上可以聲明變量($ var)或初始化($ var ='bla')。一個非聲明變量和一個聲明爲空字符串的變量並不相同。 – 2009-08-08 14:02:42

0

如果friendid是集,friendid = friendid否則friendid =空

1

從您的回覆菲利普我認爲你需要看看emptyisset之間的差異。

總結如果變量存在,isset()將返回布爾值TRUE。因此,如果您要這樣做

$fid = $_GET['friendid'] = ""; 
$exists = isset($fid); 

$ exists將會爲TRUE,因爲$ _GET ['friendid']存在。如果這不是你想要的,我建議你看看空。 Empty將在空字符串(「」)上返回TRUE,這似乎是您所期望的。如果您確實使用了空白,請參閱我鏈接到的文檔,還有其他情況下空白將返回真實的地方,您可能不會期望它,這些情況在上述鏈接明確記錄。

HTH。

5

目前你與三元運算符的工作:

$friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

打破它的if-else聲明,它看起來像這樣:

if(!isset($_GET['friendid'])) 
    $friendid = $_GET['friendid']; 
else 
    $friendid = 'empty'; 

看看什麼在if聲明中真的發生了:

!isset($_GET['friendid']) 

注意感嘆號(!)在isset函數前面。這是另一種說法,「與之相反」。你在這裏做的是檢查$_GET['friendid']中沒有設置任何值。如果是這樣,$friendid應該取得這個價值。

但真的,它會中斷,因爲$_GET['friendid']甚至不存在。而且你不能拿出那些不存在的東西的價值。

從一開始就將其設置爲$_GET['friendid'],因此現在第一個if條件爲false,並將其傳遞給else選項。

在這種情況下,請將$friendid變量的值設置爲empty

你想要的是刪除感嘆號,然後$friendid的值將取值$_GET['friendid'],如果它已經被預先設置。

2

這個問題的最佳解決方案,即如果您還需要'檢查空字符串',是empty()

$friendid = empty($_GET['friendid']) ? 'empty' : $_GET['friendid']; 

empty()不僅檢查是否變量被設置,但附加地返回false,如果它被饋送任何可能被認爲是「空」,如一個空字符串,空數組,整數0,布爾假, ...

11

如果您懶惰且有風險,可以使用error control operator @和簡短形式ternary operator

$friendid = @$_GET['friendid']?: 'empty'; 
+1

我來到這裏尋找答案中張貼的控制結構的簡明形式,你的是完美的。謝謝。 – 2013-03-05 22:53:35

+2

只是要注意,這個解決方案比較慢,可能會干擾(嚴重寫入的)自定義錯誤處理程序等,並且if語句的執行速度會更快。但這並不意味着它是邪惡的。 – thomasrutter 2014-01-07 01:34:45

0

好的,我可能一直有一個類似的問題不熟悉!像賈斯達維斯那樣的情況。

有點困惑,但發現沒有!如... isset($ avar)與!isset($ avar)相比可以產生相當大的差異。

所以用!在地方,更多地說明是YES,因爲在

since $_GET['friendid'] = 55; has been initialized... 
           tell me 'no' - the opposite - that it hasn't and set it to empty. 
       $friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

    where not having the ! tells me yes it has something in it, leave it be. 

       $friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

如果A $ =「」那麼....工作它更少混淆。 (或者如果PHP的$ A =「」)。

我發現這種字符串和變量的使用都是字符串,有時非常令人生畏。即使通過混淆,我實際上可以理解爲什麼...只是讓我有點難以理解。

35

截至PHP 7's release,您可以使用空合併運算符(雙「?」)這個:

$var = $array["key"] ?? "default-value"; 
// which is synonymous to: 
$var = isset($array["key"]) ? $array["key"] : "default-value"; 

在PHP 5.3+,如果你正在覈實是「truthy」值,你可以使用「Elvis operator」(注意,這不會檢查isset)。

$var = $value ?: "default-value"; 
// which is synonymous to: 
$var = $value ? $value : "default-value"; 
+0

正是我在找什麼,謝謝。 – 2016-12-08 13:41:18

+1

?:-)嗯呵呵 – Greg 2016-12-08 15:53:44

0

我使用Null coalescing operator操作中,如果條件這樣

if($myArr['user'] ?? false){ 

即相當於

if(isset($myArr['user']) && $myArr['user']){