什么是PHP运营商“?”和“:”叫,他们做什么?
什么?
和:
运营商在PHP?
例如:
(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
这是条件运算符 。
$x ? $y : $z
意思是“如果$x
是真的,那么使用$y
;否则使用$z
”。
它也有一个简短的forms。
$x ?: $z
意思是“如果$x
是真的,那么使用$x
;否则使用$z
”。
人们会告诉你的是?:
“三元操作员”。 这是错误的。 ?:
是一个三元运算符,这意味着它有三个操作数。 人们认为它的名字是“三元运算符”,因为它通常是给定语言唯一的三元运算符。
我将写一些三元论,它们是什么,如何使用它们,何时以及为什么要使用它们以及何时不使用它们。
什么是三元操作符?
三元? :
? :
是if
和else
简写。 基本上就是这样。 请参阅“三元运营商”了解更多的官方解释。
从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;
它的工作原理如下…
- 首先, 条件评估。
- 如果条件为真,那么expression式1被删除。 expression1的值被分配给variables 。
- 如果条件为false,则评估expression2 。 expression2的值被分配给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;
这基本上是写一个if
– else
语句的奇特方式。 有人说,阅读起来比较容易,有些则说不。
三维运算符在维基百科
正如John T所说,它被称为三元运算符,实际上是一个if / else语句的简写版本。 你的例子,作为一个完整的if / else语句,会读取;
if($request_type == 'SSL') { HTTPS_SERVER; } else { HTTP_SERVER; }