2

在哪里:

$b = true;
$c = 0;
$a = ($a ? ($a ? $b : $c) : ($c ? $a : $b));

我不确定如何解决。

所以我知道这是一个速记运算符,通常是以下情况:

$value ? true : false

意义

if $a = true { true } else { false };

所以:

if $a{
    if $a{
        true;}
    else{
        0;};
else{
 if $0{
    $a;}
else{
    true;}
};

这是否使 $a 的价值为真?

4

2 回答 2

3

的值$atrue

$b = true;
$c = 0;
$a = ($a ? ($a ? $b : $c) : ($c ? $a : $b));

速记可以这样解释:

if($a) {
  if($a) {
     $a = $b;
  } else {
     $a = $c;
  }
} else {
  if($c) {
     $a = $a;
  } else {
     $a = $b;
  }
}

因为$a一开始就不存在是假的,所以它立即跳转到 else 语句。所以对你来说唯一重要的部分是:

  if($c) {
     $a = $a;
  } else {
     $a = $b;
  }

0与 相同false,因此$c将返回为假,因此$a等于$b,即true

编辑:

关于抛出的通知有一些讨论,但这并不能说明通知并不是真正的错误,因此不会中断代码。结果不是Notice: Undefined variable: a,“结果”(认为这些人的意思是输出)如果不是我们$avar_dump. 问题是关于$a变成什么的价值,而不是屏幕上显示的内容。

屏幕上显示的与未设置变量有关的内容与实际值无关$a

如果执行以下代码,通知并不是唯一实现的:

$b = true;
$c = 0;
$a = ($a ? ($a ? $b : $c) : ($c ? $a : $b));

var_dump($a);

所以输出是:

E_NOTICE : type 8 -- Undefined variable: a -- at line 5
bool(true)

发出通知的事实并不妨碍$a成为真实。

通知也很容易被压制......

error_reporting(0);
$b = true;
$c = 0;
$a = ($a ? ($a ? $b : $c) : ($c ? $a : $b));

var_dump($a);

将导致$a仍然变为真实,并且没有看到通知。

bool(true)
于 2016-02-24T01:09:45.947 回答
1

如果你按原样运行代码,你会得到:Notice: Undefined variable: a in myfile.php on line 4

因此,我会假设$a是在更早的地方设置的。然而,无论 $a 之前的值如何,如果 $a 可以被评估为真或假,那么在运行代码后 $a 仍然为真,原因如下:

如果 $a 为真,那么第一部分将产生 $a = $b 并且我们知道 $b = true。

if(TRUE) {
  if(TRUE) {
     $a = $b;  //AND $b == TRUE
  } else {
     $a = $c;
  }
} else {
    ...
}

如果 $a 为假,那么第二部分将再次产生 $a = $b

if(FALSE) {
    ...
} else {
  if(0) {    // 0 will equate to FALSE
     ...
  } else {
    // 0 is the same as FALSE so we end up again with $a = $b
     $a = $b;  //AND $b == TRUE
  }
}

事实上,如果你运行这段代码,它会告诉你 $a 的值两次都是真的:

<?php
$a = false;
$b = true;
$c = 0;
$a = ($a ? ($a ? $b : $c) : ($c ? $a : $b));

echo $a;

$a = true;
$b = true;
$c = 0;
$a = ($a ? ($a ? $b : $c) : ($c ? $a : $b));

echo $a;
于 2016-02-24T01:18:18.267 回答