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

seb*_*seb 44 php syntax conditional conditional-operator

PHP中有哪些?:运算符?

例如:

(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 76

这是条件运算符.

$x ? $y : $z
Run Code Online (Sandbox Code Playgroud)

意思是"如果$x是真的,那么使用$y;否则使用$z".

它也有一个简短的形式.

$x ?: $z
Run Code Online (Sandbox Code Playgroud)

意思是"如果$x是真的,那么使用$x;否则使用$z".

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

  • 我并不反对,但我有时会觉得人们对他们的条件操作员的仇恨太过分了.我会这么说?:只要它使代码更清晰和更清晰就应该使用 - 为了"更清楚"的目的,我们可以假设阅读代码的人很容易理解什么?:的确如此. (6认同)
  • 我喜欢return语句的条件运算符(显然需要条件.)一个return关键字,两个条件.:) (5认同)
  • 我个人喜欢条件表达,发现它们非常容易阅读.一旦你明白他们是'IF'的捷径,你就会想知道他们是如何努力的.但我猜每个都是他自己的.:O) (5认同)
  • @grossvogel:不,但是如果这个词实际或潜在地描述了*无数其他的东西*,那么是的,这意味着它不能成为它的名字.而你指出的事实使得Zend*甚至是愚蠢的*,因为现在他们说"三元运算符",正如他们蠢蠢地称之为,它有一个形式*它是一个二元运算符*. (5认同)
  • 当然,在良好的语言中,"if,then,else"是一种表达方式.;) (4认同)
  • 我喜欢条件运算符...... :( (3认同)
  • 我字面上认为它被称为三元运算符.谢谢你的澄清. (3认同)
  • @chaos:我们从老师,学校或工作中学到这一点.然后我们复制它.因为我们是男教育的受害者,所以纠正我们是件好事. (3认同)
  • 来自php文档http://php.net/manual/en/migration53.new-features.php:三元运算符现在有一个速记形式:?:只是因为一个词描述的东西并不意味着它不能也是它的名字. (2认同)
  • @nikic:如果有十万人从桥上跳下来,他们仍然都是傻瓜.词语具有实际意义,包括"三元"和"算子"这两个词,而白痴以类似旅行的方式重复他们不理解的东西并不是语言的进化. (2认同)
  • 我称它为“**the** 三元运算符”没有问题。这是我职业生涯中唯一遇到过的三操作数运算符。如果您可以使用任何其他三操作数运算符命名编程语言的实例,请启发我们。另一方面,我将其称为“**the** 条件运算符”有问题,这意味着它是唯一可以用作条件的运算符。然而,我们有像“AND”和“OR”这样的运算符来检查左操作数是否为真,使它们成为条件运算符。它由两者兼而有之,并且经常被一起引用,因为它们是一回事。 (2认同)

Jim*_*mbo 30

我将写一些关于三元组,它们是什么,如何使用它们,何时以及为何使用它们以及何时不使用它们.

什么是三元运算符?

三元? :是简if和的简写else.基本上就是这样.有关更多官方解释,请参阅本页后半部分的"三元运算符" .

从PHP 5.3开始:

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

从PHP 7.0开始

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

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

$result = isset($nonExistentVariable) ? $nonExistentVariable : ‘default’;
Run Code Online (Sandbox Code Playgroud)

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

$result = $nonExistentVariable ?? ‘default’;
Run Code Online (Sandbox Code Playgroud)

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

$user = $userImpersonatingAnotherUser ?? $loggedInUser ?? “Guest”;
Run Code Online (Sandbox Code Playgroud)

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

三元如何使用?

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

if (isset($_POST['hello']))
{
    $var = 'exists';
}
else
{
    $var = 'error';
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

$isWinner = false;

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

// Same goes for return
return ($isWinner) ? 'You win!' : 'You lose';
Run Code Online (Sandbox Code Playgroud)

为什么人们使用它们?

我认为三元组是性感的.一些开发人员喜欢炫耀,但有时三元组的代码看起来很不错,特别是当与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> 
-->
Run Code Online (Sandbox Code Playgroud)

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

if ($isWinner) :
    // Show something cool
endif;
Run Code Online (Sandbox Code Playgroud)

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

三元运算符的速度有多快?

人们喜欢微观优化.他们只是这样做.因此对于一些人来说,重要的是要知道与正常if/ else陈述相比,三元组的速度有多快.

阅读这篇文章,差异大约是0.5ms.好多啊!

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

何时不使用三元

你的代码应该是:

  • 易于阅读
  • 容易明白
  • 易于修改

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

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."));
Run Code Online (Sandbox Code Playgroud)

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

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

结论

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


Joh*_*n T 12

它被称为三元运算符.如果使用第一个表达式求值为true,则选择HTTPS_SERVERelse HTTP_SERVER.

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

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}
Run Code Online (Sandbox Code Playgroud)

  • 它不是*三元运算符,只是*a*三元运算符.三元意味着函数(运算符)有三个参数. (4认同)
  • 是的,在这种情况下,维基百科就在我身边.:) (3认同)

Den*_*gan 6

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

$hello = $something ? "Yes, it's true" : "No, it's false";
Run Code Online (Sandbox Code Playgroud)


小智 5

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

variable = condition ? expression1 : expression2;
Run Code Online (Sandbox Code Playgroud)

它的工作原理如下...

  1. 首先,评估条件
  2. 如果条件为真,则表达式1被评估。然后将expression1的值分配给变量
  3. 如果条件为假,则对expression2求值。然后将expression2的值分配给变量。

例如:

x = (a>b) ? 5 : 9
Run Code Online (Sandbox Code Playgroud)

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

三元运算符

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

x ? y : z
Run Code Online (Sandbox Code Playgroud)

在此,x,y和z是三个操作数。如果条件x为真,则分配值y,否则分配值z。