这是一个代码示例:
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的默认值,而不返回?
getIsGuest()
正在返回$this->getState('__id')与null的比较。
如果$this->getState('__id')
恰好返回null
,则getIsGuest()
函数返回true。如果它只返回null
以外的任何值,那么getIsGuest()
函数将返回false。
===是php中的类型相等。在这种情况下,它将用于判断0、"、false或实际值null之间的差异。
这不是一个很好的示例,但它没有默认值。您可以确信的是,getIsGuest
方法将始终返回布尔值(true
或false
)。在您的代码片段中,它总是返回false,因为它使用另一个方法(getState
)的返回值,并将其与null
进行严格比较(值和类型)。由于getState
成员函数在您的示例中被硬编码为返回char,因此它将从不返回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)与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;
,因为''
是一个空字符串,就像0
是伪造的等等…