這並不是一個好例子,但是沒有什麼默認值。你可以可以肯定的是,getIsGuest
方法將總是返回一個布爾值(true
或false
)。在你的代碼片段中,它總是返回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 ...
值得一提的是,'==='運算符就像'==',但不是將類型轉換爲相同的類型,而是檢查相等性,並檢查類型是否也是相同的或者更確切地說,檢查值是相同的,而不嘗試轉換類型)。 – slugonamission
+1,好點。我沒有解釋爲什麼我選擇說'完全無效'。 –
啊,對不起,我錯過了那一點。我只記得被這件事發現,因爲0和'0'也會被強制爲空(我認爲)。 – slugonamission