Php 为什么简写if-then-else中的空值返回'true'?

Php 为什么简写if-then-else中的空值返回'true'?,php,if-statement,control-structure,shorthand-if,Php,If Statement,Control Structure,Shorthand If,这不完全是一个“问题”,而是一个“为什么”的问题 基于以下示例: echo 'test' . ( true ? : 'some-test' ); 为什么会出现这样的结果:test1而不是人们所期望的:test 或者换句话说:为什么一个空的返回语句1(或者实际上是true)而不是null?,三元?:运算符的中间部分可以省略。 foo?:bar相当于foo?foo:bar。所以true?:…总是返回第一个true foo?:“如果为真,则无任何内容”的含义是无效的,并且始终无效,因为此表达式必须

这不完全是一个“问题”,而是一个“为什么”的问题

基于以下示例:

echo 'test' . ( true ?  : 'some-test' );
为什么会出现这样的结果:
test1
而不是人们所期望的:
test

或者换句话说:为什么一个空的返回语句
1
(或者实际上是
true
)而不是
null

,三元
?:
运算符的中间部分可以省略。
foo?:bar
相当于
foo?foo:bar
。所以
true?:…
总是返回第一个
true

<代码>foo?:“如果为真,则无任何内容”的含义是无效的,并且始终无效,因为此表达式必须返回某些内容,所以它不能仅返回任何内容。如果有的话,你会想要这个:
foo?null:bar

,三元
?:
运算符的中间部分可以省略。
foo?:bar
相当于
foo?foo:bar
。所以
true?:…
总是返回第一个
true


foo?:“如果为真,则无任何内容”的含义是无效的,并且始终无效,因为此表达式必须返回某些内容,所以它不能仅返回任何内容。如果有的话,你会想要这个:
foo?null:bar

这是因为PHP5.3

“由于PHP 5.3,可以省略三元运算符的中间部分。表达式
expr1?:expr3
如果
expr1
的计算结果为
TRUE
,则返回
expr3
。”


这是因为PHP5.3

“由于PHP 5.3,可以省略三元运算符的中间部分。表达式
expr1?:expr3
如果
expr1
的计算结果为
TRUE
,则返回
expr3
。”

变量转储(true?:“一些测试”)
bool(真)

var_dump('test'.true)
字符串(5)“test1”

我希望这一部分很清楚。 这是什么意思?:'某些测试“
的计算结果为
true
。这是PHP5.3中引入的一种新行为,如果省略中间表达式,将返回第一个表达式的值(在您的示例中为
true
)。
var_dump(true?:“some test”)
bool(真)

var_dump('test'.true)
字符串(5)“test1”

我希望这一部分很清楚。 这是什么意思?:'某些测试“
的计算结果为
true
。这是PHP5.3中引入的一种新行为,如果省略中间表达式,则返回第一个表达式的值(
true
) 有一些额外的空格,但这种语法通常被称为

考虑以下几点:

$result = ($this ?: $that);
如果
$this
是真实的,
$result
将是
$this
,否则将是
$this

因此,在执行以下等效操作时:

echo (true ?: 'some-test');
结果总是:

或字符串“1”

空格不等于null 请注意:

$var = (true ?      : 'some-test');
不等同于:

$var = (true ? null : 'some-test');
只有在后一个示例中,
$var
才会为空,因为它是一个标准的三元if语句;第一句话是一个大骗子埃尔维斯操作员。

埃尔维斯操作员 有一些额外的空格,但这种语法通常被称为

考虑以下几点:

$result = ($this ?: $that);
如果
$this
是真实的,
$result
将是
$this
,否则将是
$this

因此,在执行以下等效操作时:

echo (true ?: 'some-test');
结果总是:

或字符串“1”

空格不等于null 请注意:

$var = (true ?      : 'some-test');
不等同于:

$var = (true ? null : 'some-test');

只有在后一个示例中,
$var
才会为空,因为它是一个标准的三元if语句;第一个语句是一个大而狡黠的elvis操作符。

它在回显test1,因为回显时true总是1。尝试用false替换true。猜猜会发生什么?试试回声测试。(真的?“一些测试”);因为真实总是会让我明白。真正的问题是:为什么一个空值首先返回为true。如果我做了
(true?true:'some test')
@rakesharma我知道如何避免这种情况,我会想到这一点。如前所述,这不是一个“问题”。我只是很好奇为什么一开始会返回true,而不是null。哦,我知道你的问题了,它在回显test1,因为当你回显它时,true总是1。尝试用false替换true。猜猜会发生什么?试试回声测试。(真的?“一些测试”);因为真实总是会让我明白。真正的问题是:为什么一个空值首先返回为true。如果我做了
(true?true:'some test')
@rakesharma我知道如何避免这种情况,我会想到这一点。如前所述,这不是一个“问题”。我只是很好奇为什么一开始会返回true,而不是null。哦,我知道你的问题了,我喜欢这样。。。猫王操作员你的猫王操作员已经变成了一个有雀斑的舌头伸出来的操作员。。。!?为了澄清,增加了额外的空白。事实上,我通常在没有它们的情况下使用它。但基本上:当语句为空时,返回运算符结果?确实如此(用于提供链接的thx@lagbox)。我不知道默认情况下会返回运算符结果。谢谢!我喜欢。。。猫王操作员你的猫王操作员已经变成了一个有雀斑的舌头伸出来的操作员。。。!?为了澄清,增加了额外的空白。事实上,我通常在没有它们的情况下使用它。但基本上:当语句为空时,返回运算符结果?确实如此(用于提供链接的thx@lagbox)。我不知道默认情况下会返回运算符结果。谢谢!有趣的是,
仍然被视为两个独立的标记,解析器只是