这是一个代码示例:
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';
}
返回$ this-> foo()=== null是没有返回的foo的默认值?
答案 0 :(得分:3)
getIsGuest()
将$ this-> getState('__ id')的比较返回null。
如果$this->getState('__id')
完全返回null
,则getIsGuest()
函数返回true。如果它返回除null
之外的任何内容,则getIsGuest()
函数返回false。
答案 1 :(得分:0)
===是php中的类型相等。在这种情况下,它将用于区分0,'',false或实际值null。
答案 2 :(得分:0)
这不是一个好样本,但它没有什么默认值。您可以确定的是,getIsGuest
方法将总是返回布尔值(true
或false
)。在您的代码段中,它始终返回false,因为它使用另一个方法(getState
)的返回值并严格将其与null
进行比较(值和类型) 。由于getState
成员函数是硬编码的,以便在您的示例中返回一个字符,因此永远不会返回null,因此,getIsGuest
将始终返回false。
PHP有null
作为没有显式return语句的所有函数或方法的默认返回值(可能的例外情况是构造函数,它返回一个对象的实例)。就像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)与null进行比较,并返回true(因为它们是相同的)
构造函数接收true,因为这是调用getIsGuest
方法的位置,并评估值if ($this->getIsGuest())
- >是的,所以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;
,因为''
一个空字符串是null-ish,就像0
是falsy等...