什么是PHP运营商“?”和“:”叫,他们做了什么?

时间:2009-07-03 17:27:15

标签: php syntax conditional conditional-operator

PHP中的?:运算符是什么?

例如:

(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)

10 个答案:

答案 0 :(得分:74)

这是条件运算符

$x ? $y : $z

表示“如果$x为真,则使用$y;否则请使用$z”。

它也有一个简短的形式。

$x ?: $z

表示“如果$x为真,则使用$x;否则请使用$z”。

人们会告诉你?:是“三元运算符”。这是错的。 ?:一个三元运算符,这意味着它有三个操作数。人们最终认为它的名字是“三元运算符”,因为它通常是给定语言中唯一的三元运算符。

答案 1 :(得分:30)

  

我要写一点关于三元,它们是什么,如何使用它们,何时以及为何使用它们以及何时不使用它们。

什么是三元运营商?

三元? :ifelse的简写。基本上就是这样。有关更多官方解释,请参阅this page中间的“三元运算符”。

自PHP 5.3起

  

从PHP 5.3开始,可以省略三元运算符的中间部分。表达式expr1?:expr3如果expr1的计算结果为TRUE则返回expr1,否则返回expr3。

自PHP 7.0起

  

PHP 7有新的Null Coalesce Operator。这与三元相同,但也称为“isset ternary”。这也允许一组链接的三元组,无需进行isset()检查。

在PHP 5中,如果你想使用一个可能不存在的变量的三元组,那么你必须在三元语句的开头执行一个isset():

$result = isset($nonExistentVariable) ? $nonExistentVariable : ‘default’;

在PHP 7中,您现在可以改为:

$result = $nonExistentVariable ?? ‘default’;

Null Coalesce Operator无法使用空字符串,因此请记住这一点。关于这一点的好处是你还可以链接运算符以对多个变量进行多次检查,根据链中的每个变量是否存在提供一种备份:

$user = $userImpersonatingAnotherUser ?? $loggedInUser ?? “Guest”;

在PHP中,对于用户可以登录的系统,管理员能够模拟其他用户进行测试的情况并不少见。通过上面的示例,如果用户没有模仿另一个用户,并且登录的用户也不存在,则用户将成为访客用户。如果您还没有理解这一点,请继续阅读更多信息,看看它们是什么以及它们是如何使用的,然后再回过头来看看新的PHP如何

如何使用三元组?

以下是正常if语句的外观:

if (isset($_POST['hello']))
{
    $var = 'exists';
}
else
{
    $var = 'error';
}

让我们将其缩短为三元组。

$var = isset($_POST['hello']) ? 'exists' : 'error';
                 ^            ^     ^    ^     |
                 |           then   |   else   |
                 |                  |          |
          if post isset         $var=this   $var=this

更短,但可能更难阅读。它们不仅用于设置前一个示例中的$var变量,还可以使用echo执行此操作,并检查变量是否为false:

$isWinner = false;

// Outputs 'you lose'
echo ($isWinner) ? 'You win!' : 'You lose';

// Same goes for return
return ($isWinner) ? 'You win!' : 'You lose';

为什么人们会使用它们?

我认为三元组很性感。一些开发人员喜欢炫耀,但有时候三元组只是看起来很好代码,尤其是与PHP 5.4最新版本short echos等其他功能结合使用。< / p>

<?php 
    $array = array(0 => 'orange', 1 => 'multicoloured'); 
?>

<div>
    <?php foreach ($array as $key => $value) { ?>
        <span><?=($value==='multicoloured')?'nonsense':'pointless'?></span>
    <?php } ?>
</div>

<!-- Outputs:
    <span>
        pointless
    </span>
    <span>
        nonsense
    </span> 
-->

稍微偏离主题,当你处于'视图/模板'时(如果你通过MVC范例分离你的关注点),你想要尽可能少的服务器端逻辑。因此,使用三元和其他短手代码有时是最好的前进方式。通过“其他简写代码”,我的意思是:

if ($isWinner) :
    // Show something cool
endif;

注意,我个人不喜欢这种速记if / endif废话

三元运营商的速度有多快?

人们喜欢微观优化。他们只是这样做。因此,对于某些人来说,与普通if / else陈述相比,了解三元组的速度有多快是很重要的。

阅读this post,差异大约为0.5毫秒。那太多了!

等等,不,不是。如果你连续不断地成千上万次地做这件事,那就太多了。哪个你不会。所以不要担心速度优化,这里绝对没有意义。

何时不使用三元

您的代码应为:

  • 易于阅读
  • 易于理解
  • 易于修改

显然,在查看您的代码时,这取决于人员的智能和编码知识/对这些概念的一般理解水平。像前面的例子一样简单的三元组是可以的,但是,如下所示你应该做什么:

echo ($colour === 'red') ? "Omg we're going to die" :
     ($colour === 'blue' ? "Ah sunshine and daisies" :
     ($colour === 'green' ? "Trees are green"
     : "The bloody colour is orange, isn't it? That was pointless."));

由于三个原因,这是毫无意义的:

  • 可笑的长三元嵌入
  • 可能只是使用了switch声明
  • 首先是橙色

<强>结论

三元组真的很简单,没有什么可以解决的。不要考虑任何速度改进,它确实不会有所作为。当它们简单看起来不错时使用它们,并始终确保您的代码将来可供其他人阅读。如果这意味着没有三元,那就不要使用三元。

答案 2 :(得分:12)

它被称为ternary operator。如果第一个表达式的计算结果为true,则使用HTTPS_SERVER,否则选择HTTP_SERVER

它基本上是一个简写if语句,上面的代码也可以改写如下:

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}

答案 3 :(得分:6)

这有时被称为三元条件运算符。三元意味着它有三个参数,如x ? y : z。基本上,它检查x是否为真;如果是,则将y代替此操作,否则z

$hello = $something ? "Yes, it's true" : "No, it's false";

答案 4 :(得分:5)

条件运算符 ? : 是一个运算符,用于检查条件并根据条件的值选择值。它以下列形式表示:

variable = condition ? expression1 : expression2;

它的工作原理如下......

  1. 首先,评估条件
  2. 如果条件为true,则 expression1 会被唤醒。并且 expression1 的值已分配给变量
  3. 如果条件为false,则评估 expression2 。并且 expression2 的值将分配给变量。
  4. 例如:

    x = (a>b) ? 5 : 9
    

    在此,对于x,首先评估条件(a> b)。如果该条件成立,则x将变为值5(即,x = 5)。但是如果条件(a> b)变为假,则x将达到值9(即,x = 9)。

    三元运营商

    有时,条件运算符 ? : 也称为三元运算符。这是因为它涉及三个操作数。例如:

    x ? y : z
    

    这里,x,y和z是三个操作数。如果条件x为真,则指定值y,否则指定值z。

答案 5 :(得分:2)

这是写if句的简短方法。它也用于其他语言,如Java,JavaScript等。

您的代码,

$protocol = $request_type == 'SSL' ? HTTPS_SERVER : HTTP_SERVER;

可以这样写:

if ($request_type == 'SSL')
    $protocol = HTTPS_SERVER;
else
    $protocol = HTTP_SERVER;

答案 6 :(得分:0)

这是一行if语句:

condition ? true : false

在您的案例中翻译为普通的if语句,即:

if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;

答案 7 :(得分:0)

这基本上是编写if - else语句的一种奇特方式。有人说它更容易阅读,有些人说没有。

Ternary operator at Wikipedia

答案 8 :(得分:0)

这就像if语句一样工作,一旦您习惯了它就非常简单。 (conditions_expressions)? what_to_do_if_true:what_to_do_if_false。

答案 9 :(得分:-1)

正如John T所说,它被称为三元运算符,实质上是if / else语句的简写版本。您的示例,作为完整的if / else语句,将读取;

if($request_type == 'SSL')
{
    HTTPS_SERVER;
}
else
{
    HTTP_SERVER;
}