有人能解释一下PHP中三元运算符速记(?:)和空合并运算符(?)之间的区别吗
他们什么时候会有不同的行为?什么时候会有相同的行为
$a?:$b
VS
$a$B
当您的第一个参数为null时,它们基本相同,只是当您有未定义的变量时,null合并不会输出E_通知。PHP 7.0迁移文档中有这样一句话:
空合并运算符(??)已作为语法糖添加
对于需要结合使用三元数的常见情况
isset()。如果第一个操作数存在且不为空,则返回第一个操作数;
否则返回第二个操作数
下面是一些示例代码来演示这一点:
<;?php
$a=null;
打印$a???'b';//B
打印“\n”;
打印$a?:“b”;//B
打印“\n”;
打印$c??'a’;//A.
打印“\n”;
打印$c?:“a”;//注意:未定义的变量:第14行中的c in/in/apAIb
打印“\n”;
$b=数组('a'=>;空);
打印$b['a']??'d’;//D
打印“\n”;
打印$b['a']?:'d';//D
打印“\n”;
打印$b['c']??'e’;//E
打印“\n”;
打印$b['c']?:'e';//注意:第33行未定义索引:c in/in/apAIb
打印“\n”;
有通知的行是我使用速记三元运算符而不是空合并运算符的行。然而,即使有了通知,PHP也会给出同样的回复
执行代码:https://3v4l.org/McavC
当然,这总是假设第一个参数是null。一旦它不再为null,那么您将得到不同的结果,?操作符将始终返回第一个参数,而?:速记仅在第一个参数为truthy时才会返回,这取决于PHP将如何将内容转换为布尔值
因此:
$a=falsef';//错误的
$b=false?:'g';/'g'
然后,$a等于false,$b等于'g'