73

可能重复: What are the PHP operators “?” and “:” called and what do they do?什么是?在PHP 5.3中?

http://twitto.org/

<?PHP 
    require __DIR__.'/c.php'; 
    if (!is_callable($c = @$_GET['c'] ?: function() { echo 'Woah!'; })) 
     throw new Exception('Error'); 
    $c(); 
?> 

Twitto使用提供了一些新的功能,如PHP 5.3:

  1. DIR不断
  2. ?:运算
  3. 匿名函数

  1. 是什么2号做的在PHP 5.3?

  2. 此外,匿名函数是什么意思?那不是一段时间以来的事情吗?

+3

已回答至少两次http://stackoverflow.com/questions/1080247/what-is-the-php-operator-called-and-what-does-it-do和http://stackoverflow.com/questions/2099834/what-does-this-syntax-in-php-mean – Gordon 2010-01-28 08:43:59

+3

@gordon,我知道这些话题意味着什么,我认为这是不同的,因为该网站称它是5.3以及新的从未见过他们像“?:” – JasonDavis 2010-01-28 08:50:56

+0

@戈登这些只是更长的形式。 @jasondavis,你有:和?在问题标题中倒退。 – RJFalconer 2010-01-28 08:54:39

回答

123

?:是条件运算这在以前是仅作为一种形式:

expr ? val_if_true : val_if_false 

在5.3它是可以省略的中间部分,例如expr ?: val_if_false这相当于:

expr ? expr : val_if_false 

manual

由于PHP 5.3,就可以离开了条件运算的中间部分。如果expr1评估为TRUE,则表达式expr1 ?: expr3返回expr1,否则返回expr3

+1

谢谢!当我看到他们在一起时,我很困惑“?:”我搜查了但找不到任何东西。 – JasonDavis 2010-01-28 08:52:47

+2

嗯非常酷。这使得JavaScript中的'':'等同于'||'! – Paulpro 2012-05-07 01:27:41

+3

作为额外的好处,你可以“链接”它们:$ foo = $ bar?:$ bazz?:$ yadda?:$ qux; // $ foo将被分配第一个truthy变量的值。不知道这是否是一个可怕的想法(有些不喜欢嵌套三元运算符),但它确实存在。 – MSpreij 2014-02-12 16:00:56

35

?:运算符是conditional operator(通常refered为三元运算符):

表达(expr1) ? (expr2) : (expr3)的计算结果为expr2如果expr1评估为TRUE,和expr3如果expr1评估为FALSE

在的情况下:

expr1 ?: expr2 

表达式求的expr1如果expr1expr2否则值:

由于PHP 5.3,所以能够省略三元操作员的中间部分。表达式expr1 ?: expr3返回expr1,如果expr1的计算结果为,则返回,否则返回expr3

4

Look here:

由于PHP 5.3,就可以离开了三元运算符的中间部分。表达式expr1?:如果expr1的计算结果为TRUE,则expr3返回expr1,否则返回expr3。

匿名函数:不,他们不存在before 5.3.0(见下面的例子中的第一个音符),至少是这样的:

function ($arg) { /* func body */ } 

的唯一途径是create_function(),这是速度较慢,相当麻烦并容易出错(因为使用字符串进行函数定义)。