php8新特性,如何理解使用单问号空运算符?
发布于 作者:苏南大叔 来源:程序如此灵动~
一个小小的问号,也是php8的一个新特性。本文主要讨论的php8中的单问号空运算符是如何使用的,这个空运算符的使用,不同于已知的三目运算,也不同于js中的双问号空运算符,有着其自己的独到逻辑。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码感悟。本文测试环境:win10,nginx@1.15.11,php@8.2.10-nts。
对比项,三目运算符/双问号运算
php的三目运算符,里面也有个问号,例如:
$a = ($name=="苏南大叔")?"ok":"sorry";JavaScript最新标准里面,也增加了个双问号空值判断运算符【注意:不是php,是js/node】,例如:
sn = null ?? "苏南大叔"; // 苏南大叔单问号空运算
这个php8 新增的单问号空运算,看起来很像是没写后半部分的三目运算符号。
x = y ? z运算;三目运算本质上是赋值,而新的这个问号空运算符,本质上是要执行运算。y为空,则x是null,不再执行后续的z运算。不为null,则继续执行z运算。
如果把z写成字符串的话(就是说:按着三目运算符理解的话),直接报错。
Parse error: syntax error, unexpected token ";" 测试代码
php8的最新特性,单问号空运算符的测试代码如下所示:
class Blog{
public function __construct(public string $domain){
}
public function getUrl(){
return "https://".$this->domain."/";
}
}
class SuNan{
public function __construct(public string $name,private string $domain){
$this->Blog = new Blog($domain);
}
public function getBlog(){
return $this->name == "苏南大叔" ? $this->Blog : null ;
}
}
$ss = new SuNan(domain:"newsn.net",name:"苏南大叔");
$nn = $ss->getBlog()?->getUrl();
$ss2 = new SuNan("sunan大叔","newsn.com.cn");
$nn2 = $ss2->getBlog()?->getUrl();
var_dump($nn);
var_dump($nn2);输出:
string(18) "https://newsn.net/"
NULL表格对比
| 语言 | 项目 | 例子 | 解释 |
|---|---|---|---|
| php/js | 三目运算 | a?b:c | a为真?则返回b |
| js | 空值合并运算 | a?b | a为null?则b为默认值 |
| php | 空运算符 | a?->b | a为null?则返回null,不继续执行b操作 |
猛地看上去,
js和php的问号逻辑是完全相反的。js中是个赋值操作,而php中是个运算操作。
相关文章
结束语
更多苏南大叔写过的php经验文章,请点击下面的链接:



