где:
$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
было бы true
$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
«результат» (думаю, что эти люди имеют в виду результат) был бы пустым, если бы не мы определяли ценность $a
в конце с var_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)
Если вы запустите код как есть, вы получите: Notice: Undefined variable: a in myfile.php on line 4
Поэтому я бы постулировал $a
установлен где-то ранее. Тем не менее, независимо от того, какое значение $ a имеет ранее, если $ a может быть оценено как true или false, $ a все равно будет true после запуска вашего кода по следующей причине:
Если бы $ 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;