如何编写 PHP 三元运算符

如何使用 elseif 部分编写 PHP 三元运算符?

我看到 PHP 三元运算符的 ifelse部分的基本示例如下:

echo (true)  ? "yes" : "no";    //prints yes
echo (false) ? "yes" : "no";    //prints no

如何将这样的“ elseif”部分转换为三元运算符?

<?php
if($result->vocation == 1){
echo "Sorcerer";
}else if($result->vocation == 2){
echo 'Druid';
}else if($result->vocation == 3){
echo 'Paladin';
}else if($result->vocation == 4){
echo 'Knight';
}else if($result->vocation == 5){
echo 'Master Sorcerer';
}else if($result->vocation == 6){
echo 'Elder Druid';
}else if($result->vocation == 7){
echo 'Royal Paladin';
}else{
echo 'Elite Knight';
}
?>
139087 次浏览

你不会这么做,因为这本书杂乱无章,难以阅读。

您要在第一种情况下查找 switch语句。第二种方法很好,但仍然可以转换为一致性

三元语句更适合于布尔值和交替逻辑。

echo ($result ->vocation == 1) ? 'Sorcerer'
: ($result->vocation == 2) ? 'Druid'
:  ($result->vocation == 3) ? 'Paladin'
....


;

有点难看。你应该坚持使用正常的 if语句。

对于你想要的东西,三元不是一个好的解决方案。它在您的代码中不可读,而且有更好的解决方案可用。

为什么不使用数组查找“ map”或“ dictionary”,如下所示:

$vocations = array(
1 => "Sorcerer",
2 => "Druid",
3 => "Paladin",
...
);


echo $vocations[$result->vocation];

这个应用程序的三元结果如下:

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

为什么会这样?因为-作为一个单独的长行,如果这里出了问题,您将得不到有效的调试信息,长度使其难以阅读,加上多个三元组的嵌套感觉很奇怪。

标准三进制 很简单,易于阅读,看起来像这样:

$value = ($condition) ? 'Truthy Value' : 'Falsey Value';

或者

echo ($some_condition) ? 'The condition is true!' : 'The condition is false.';

三进制实际上只是编写简单 if else语句的一种方便/简短的方法。上述三元样品与:

if ($some_condition) {
echo 'The condition is true!';
} else {
echo 'The condition is false!';
}

然而,用于复杂逻辑的三元数很快就变得不可读,不再值得这样简短。

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

即使使用一些细心的格式将它分散在多行中,它也不是很清楚:

echo($result->group_id == 1
? "Player"
: ($result->group_id == 2
? "Gamemaster"
: ($result->group_id == 3
? "God"
: "unknown")));

老实说,三元运算符只会让情况变得更糟,如果你的目标是让它变得更简单,我的建议是:

$groups = array(1=>"Player", 2=>"Gamemaster", 3=>"God");
echo($groups[$result->group_id]);

然后在你们的职业生涯中也会有类似的事情发生

$vocations = array(
1=>"Sorcerer",
2=>"Druid",
3=>"Paladin",
4=>"Knight",
....
);
echo($vocations[$result->vocation]);

使用三元运算符,您最终将得到

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

你可以看出来,你越往里面加东西,情况就越复杂

比起三元 if 语句,我更愿意使用 switch-case。例如:

switch($result->vocation){
case 1:
echo "Sorcerer";
break;
case 2:
echo "Druid";
break;
case 3:
echo "Paladin";
break;
case 4:
echo "Knight";
break;
case 5:
echo "Master Sorcerer";
break;
case 6:
echo "Elder Druid";
break;
case 7:
echo "Royal Paladin";
break;
default:
echo "Elite Knight";
break;
}

除了所有其他的答案,你可以使用 switch。但它似乎有点长。

switch ($result->vocation) {
case 1:
echo 'Sorcerer';
break;


case 2:
echo 'Druid';
break;


case 3:
echo 'Paladin';
break;


case 4:
echo 'Knight';
break;


case 5:
echo 'Master Sorcerer';
break;


case 6:
echo 'Elder Druid';
break;


case 7:
echo 'Royal Paladin';
break;


default:
echo 'Elite Knight';
break;
}

由于这是一个常见的任务,我建议在函数调用中包装开关/大小写。

function getVocationName($vocation){
switch($vocation){
case 1: return "Sorcerer";
case 2: return 'Druid';
case 3: return 'Paladin';
case 4: return 'Knight';
case 5: return 'Master Sorcerer';
case 6: return 'Elder Druid';
case 7: return 'Royal Paladin';
default: return 'Elite Knight';
}
}


echo getVocationName($result->vocation);

如何编写一个基本的 PHP 三元运算符:

($your_boolean) ? 'This is returned if true' : 'This is returned if false';

例如:

$myboolean = true;
echo ($myboolean) ? 'foobar' : "penguin";
foobar


echo (!$myboolean) ? 'foobar' : "penguin";
penguin

一个 PHP 三元操作符,里面塞了一个“ elseif”:

$chow = 3;
echo ($chow == 1) ? "one" : ($chow == 2) ? "two" : "three";
three

但请不要嵌套三元操作符,除非是小把戏。这是一个坏的代码气味。

你也可以这样做:

echo "yes" ?: "no" // Assuming that yes is a variable that can be false.

而不是:

echo (true)  ? "yes" : "no";

PHP8(左结合三元运算符更改)

左结合三元算子弃用 https://wiki.php.net/rfc/ternary_associativity。 三元操作符在 PHP 中有一些奇怪的地方。这个 RFC 为嵌套的三元语句添加了一个弃用警告。在 PHP8中,这种弃用将被转换为编译时错误。

1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok

来源: https://stitcher.io/blog/new-in-php-74#numeric-literal-separator-rfc