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

什么?:运营商在PHP?

例如:

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

这是条件运算符

 $x ? $y : $z 

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

它也有一个简短的forms。

 $x ?: $z 

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

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

我将写一些三元论,它们是什么,如何使用它们,何时以及为什么要使用它们以及何时不使用它们。

什么是三元操作符?

三元? : ? :ifelse简写。 基本上就是这样。 请参阅“三元运营商”了解更多的官方解释。

从PHP 5.3开始

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

从PHP 7.0开始

PHP 7有新的合并运算符。 这与三元相同,但也被称为“ isset三元 ”。 这也允许一组链式三元组去除isset()检查。

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

 $result = isset($nonExistentVariable) ? $nonExistentVariable : 'default'; 

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

 $result = $nonExistentVariable ?? 'default'; 

空合并运算符不能使用空string,但是,请牢记这一点。 关于这一点的好处是,您还可以链接操作员对多个variables进行多重检查,根据链中是否存在每个variables来提供一种备份:

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

在PHP中,对于用户可以login的系统,pipe理员能够冒充另一个用户用于testing目的并不罕见。 通过上面的例子,如果用户不是冒充另一个用户,并且login用户不存在,那么用户将是一个访客用户。 如果您还不明白这一点,请阅读更多内容,以了解三元组是什么以及如何使用它们,然后回过头来看看新的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 

更短,但可能更难以阅读。 在前面的例子中,它们不仅用于设置variables$var ,还可以用echo来做这个variables,并检查一个variables是否为false。

 $isWinner = false; // Outputs 'you lose' echo ($isWinner) ? 'You win!' : 'You lose'; // Same goes for return return ($isWinner) ? 'You win!' : 'You lose'; 

为什么人们使用它们?

我觉得三元性感。 一些开发人员喜欢炫耀,但有时候三元组在你的代码中看起来不错特别是当与其他function(如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模式分离你的关注点)时,略微偏离主题,你需要尽可能less的服务器端逻辑。 所以,使用三元和其他短代码有时是最好的方法。 我的意思是“其他的短代码”

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

请注意,我个人不喜欢这种速记,如果/ 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.")); 

这是毫无意义的,原因有三:

  • 可笑的长三元embedded
  • 可以只使用switch语句
  • 这首先是橙色的

结论

三元论真的很简单,没有太多的工作。 不要考虑任何速度的提高,它真的不会有什么区别。 当他们很简单看起来不错时 ,请使用它们,并且确保将来您的代码将被其他人阅读。 如果这意味着没有三元组,那就不要使用三元组。

它被称为三元操作符 。 如果第一个expression式的计算结果为true,则使用HTTPS_SERVER ,否则selectHTTP_SERVER

这基本上是一个简短的陈述,上面的代码也可以重写如下:

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

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

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

有条件的运算符? : ? :是用于检查条件并根据条件的值select值的运算符。 它performance为以下forms:

 variable = condition ? expression1 : expression2; 

它的工作原理如下…

  1. 首先, 条件评估。
  2. 如果条件为真,那么expression式1被删除。 expression1的值被分配给variables
  3. 如果条件为false,则评估expression2expression2的值被分配给variables。

例如:

 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。

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

你的代码,

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

可以这样写:

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

如果陈述是这样:

 condition ? true : false 

翻译成你的情况下的一个普通的if语句,那将是:

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

这基本上是写一个ifelse语句的奇特方式。 有人说,阅读起来比较容易,有些则说不。

三维运算符在维基百科

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

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