2012-09-25 120 views
0

這是一個代碼示例:

class md { 
public function __construct() { 
    if($this->getIsGuest()){ 
     echo 'iam guest'; 
    } 
} 
public function getIsGuest() { 
    return $this->getState('__id')===null; 
} 
public function getState($val) { 
    return '3'; 
} 


是返回$這個 - > FOO()=== null被無中生有foo的默認值返回?

回答

3

getIsGuest()正在將$ this-> getState('__ id')的比較返回爲null。

如果$this->getState('__id')正好返回null,則getIsGuest()函數返回true。如果它返回除null以外的任何東西,則getIsGuest()函數返回false。

+1

值得一提的是,'==='運算符就像'==',但不是將類型轉換爲相同的類型,而是檢查相等性,並檢查類型是否也是相同的或者更確切地說,檢查值是相同的,而不嘗試轉換類型)。 – slugonamission

+0

+1,好點。我沒有解釋爲什麼我選擇說'完全無效'。 –

+0

啊,對不起,我錯過了那一點。我只記得被這件事發現,因爲0和'0'也會被強制爲空(我認爲)。 – slugonamission

0

===在php中是類型相等。在這種情況下,它將用於區分0,'',false或實際值null。

0

這並不是一個好例子,但是沒有什麼默認值。你可以可以肯定的是,getIsGuest方法將總是返回一個布爾值(truefalse)。在你的代碼片段中,它總是返回false,因爲它使用另一個方法的返回值(getState),並嚴格地將其與null進行比較(值爲類型)。由於getState成員函數在你的例子中被硬編碼返回一個字符,所以從不會返回null,因此getIsGuest總是返回false。

PHP有null作爲其沒有顯式返回語句的所有函數或方法的默認返回值(可能有構造函數的異常,它返回對象的一個​​實例)。就像JS會默認返回undefined(除了構造函數),或者C函數可以返回void,但這是另一回事。
簡而言之:不,您的代碼未設置默認返回值。我會嘗試通過編輯片段有點澄清這一切:

class md 
{ 
    private $_mdData = array();//no data 
    public function __construct(array $params = null)//default value of $params is null 
    {//the constructor expects either no parameters, or an array 
     if ($params !== null) 
     { 
      $this->_mdData = $params; 
     } 
     if($this->getIsGuest()) 
     { 
      echo 'I\'m guest'; 
     } 
    } 

    public function getIsGuest() 
    { 
     return $this->getState('__id') === null; 
    } 

    public function getState($val) 
    {//return whatever value is stored in the private array under $val-key 
    //if the key doesn't exist, null is returned 
     return (isset($this->_mdData[$val]) ? $this->_mdData[$val] : null); 
    } 
} 

$guest = new md();//no params 

構造函數調用getIsGuest,它試圖訪問$ mdData [「 _id」]
$ _mdData是空的,所以關鍵沒有按不存在,null返回getIsGuest。
getIsGuest將返回值(null)與空值進行比較,並返回true(因爲它們相同)
構造函數接收true,因爲這是調用getIsGuest方法的位置,並且計算值if ($this->getIsGuest()) - > true,所以I'm a guest被呼應。

$nonGuest = new md(array('__id'=>123));//same drill, only this time getState will return 123, and getIsGuest returns false 

現在=====之間的區別:

$nullish = new md(array('__id' => '')); 

不會呼應我是一個客人,除非你要改變return $this->getState('__id') === null;return $this->getState('__id') == null;因爲''一個空字符串is null-ish,like 0 is falsy etc ...

相關問題