48

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

例如:

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

10 回答 10

83

这是条件运算符

$x ? $y : $z

意思是“如果$x为真,则使用$y;否则使用$z”。

它也有一个简短的形式。

$x ?: $z

意思是“如果$x为真,则使用$x;否则使用$z”。

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

于 2009-07-03T17:29:17.647 回答
33

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

什么是三元运算符?

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

自 PHP 5.3 起

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

自 PHP 7.0 起

PHP 7 具有新的 Null Coalesce 运算符。这与三元相同,但也称为“ isset 三元”。这也允许一组链式三元组消除对 isset() 检查的需要。

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

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

在 PHP 7 中,您现在可以这样做:

$result = $nonExistentVariable ?? ‘default’;

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

$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, 来执行此操作,并检查变量是否为假:

$isWinner = false;

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

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

人们为什么要使用它们?

我认为三元组很性感。一些开发人员喜欢炫耀,但有时三元组在您的代码中看起来不错,尤其是与其他功能(如 PHP 5.4 的最新短回显)结合使用时。

<?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语句相比,三元组之类的东西要快多少。

阅读这篇文章,差异约为 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语句
  • 一开始是橙色的

结论

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

于 2013-07-16T10:47:36.983 回答
13

它被称为三元运算符。如果第一个表达式的计算结果为真,HTTPS_SERVER则使用,否则HTTP_SERVER选择。

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

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}
于 2009-07-03T17:29:45.290 回答
7

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

$hello = $something ? "Yes, it's true" : "No, it's false";
于 2009-07-03T17:30:53.247 回答
6

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

variable = condition ? expression1 : expression2;

它的工作原理如下...

  1. 首先,评估条件。
  2. 如果条件为真,则计算表达式1。并将expression1的值分配给变量
  3. 如果条件为假,则计算表达式2。并将expression2的值分配给变量。

例如:

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。

于 2009-08-23T22:52:08.583 回答
3

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

你的代码,

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

可以这样写:

if ($request_type == 'SSL')
    $protocol = HTTPS_SERVER;
else
    $protocol = HTTP_SERVER;
于 2009-07-03T17:50:21.083 回答
0

这是一个单行 if 语句:

condition ? true : false

在您的情况下转换为普通的 if 语句,即:

if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;
于 2009-07-03T17:30:47.117 回答
0

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

维基百科的三元运算符

于 2009-07-03T17:31:48.473 回答
0

这就像一个 if 语句,一旦你习惯了它就非常简单和容易。(条件表达式)?what_to_do_if_true :what_to_do_if_false。

于 2020-04-27T22:44:26.180 回答
-1

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

if($request_type == 'SSL')
{
    HTTPS_SERVER;
}
else
{
    HTTP_SERVER;
}
于 2009-07-03T17:32:32.373 回答