如何使用速记if / else?

我试过使用这个页面的例子,但是我不能输出任何结果。

这是我的IF声明是有效的:

if (!empty($address['street2'])) echo $address['street2'].'<br />'; 

这是我没有工作的简写代码

 $test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />'; // Also tested this (empty($address['street2'])) ? 'Yes <br />' : 'No <br />'; 

我究竟做错了什么?

UPDATE
在Brians提示之后,我发现了什么地方出了问题。 回声$testing输出结果。 所以然后我尝试了以下内容:

 echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'; 

这就像一个魅力!

 (condition) ? /* value to return if condition is true */ : /* value to return if condition is false */ ; 

语法不是一个“速记如果”运算符( ?称为条件运算符),因为您不能像执行代码一样执行代码:

 if (condition) { /* condition is true, do something like echo */ } else { /* condition is false, do something else */ } 

在你的例子中,当$address不为空时,你正在执行echo语句。 你不能用条件运算符来做同样的事情。 但是你可以做的是echo条件运算符的结果:

 echo empty($address['street2']) ? "Street2 is empty!" : $address['street2']; 

这将显示“街是空的!” 如果是空的,则显示street2地址。

基本的真/假宣言

 $is_admin = ($user['permissions'] == 'admin' ? true : false); 

有条件的欢迎消息

 echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!'; 

有条件的消息

 echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.'; 

三元运算符只是if和else块的简写。 你的工作代码没有其他条件,所以不适合这个。

以下示例将工作:

 echo empty($address['street2']) ? 'empty' : 'not empty'; 

PHP 7+

从PHP 7开始,可以简单地通过使用Null合并运算符来执行此任务,如下所示:

echo $address['street2'] ?? 'Empty';

有条件的欢迎消息

 echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!'; 

嵌套的PHP速记

 echo 'Your score is: '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') ); 

请注意, 使用嵌套的条件运算符时,可能需要使用括号来避免可能的问题!

它看起来像PHP至less在Javascript或C#中的工作方式不一样。

 $score = 15; $age = 5; // The following will return "Exceptional" echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average')); // The following will return "Horrible" echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average'); 

在这两种情况下,Javascript和C#中的相同代码都返回“Exceptional”。

在第二种情况下,PHP所做的是(或者至less这是我所理解的):

  1. $score > 10 ? 是
  2. $age > 10 ? 不,所以目前的$age > 10 ? 'Average' : 'Exceptional' $age > 10 ? 'Average' : 'Exceptional'返回“特殊”
  3. 那么,不是只停止整个陈述并返回“特殊”,而是继续评估下一个陈述
  4. 下一个陈述变成'Exceptional' ? 'Horrible' : 'Average' 'Exceptional' ? 'Horrible' : 'Average'返回'可怕',因为'特殊'是真实的

从文档: http : //php.net/manual/en/language.operators.comparison.php

build议您避免“叠加”三元expression式。 在单个语句中使用多个三元运算符时,PHP的行为是不明显的。

你可以通过replace<?=?> echo来缩短这个时间

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

当你想要在导航栏内确定菜单选项是否应该显示为已经访问(点击)时,这是非常有用的:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>

我认为你用错误的方式使用括号。 尝试这个:

 $test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />'); 

我认为它应该工作,你也可以使用:

 echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />'); 
Interesting Posts