如何使用速记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这是我所理解的):
- 是
$score > 10
? 是 - 是
$age > 10
? 不,所以目前的$age > 10 ? 'Average' : 'Exceptional'
$age > 10 ? 'Average' : 'Exceptional'
返回“特殊” - 那么,不是只停止整个陈述并返回“特殊”,而是继续评估下一个陈述
- 下一个陈述变成
'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 />');