什么是?:在PHP 5.3中?

Jas*_*vis 83 php ternary-operator language-construct conditional-operator php-5.3

可能重复: 什么是PHP运算符"?"和":"被调用,它们做了什么?

来自http://twitto.org/

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

Twitto使用从PHP 5.3开始提供的几个新功能:

  1. DIR不变
  2. 运营商
  3. 匿名功能

  1. 在PHP 5.3 中,数字2对?:做什么?

  2. 另外,匿名函数是什么意思?那不是已经存在了一段时间的东西吗?

Ben*_*mes 135

?: 是条件运算符的一种形式,以前只能用作:

expr ? val_if_true : val_if_false
Run Code Online (Sandbox Code Playgroud)

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

expr ? expr : val_if_false
Run Code Online (Sandbox Code Playgroud)

手册:

从PHP 5.3开始,可以省略条件运算符的中间部分.如果求值,则expr1 ?: expr3返回表达式,否则返回.expr1expr1TRUEexpr3

  • 作为额外的奖励,你可以"链接"它们:$ foo = $ bar?:$ bazz?:$ yadda?:$ qux; // $ foo将被赋予第一个truthy变量的值.不确定这是否是一个可怕的想法(有些人不喜欢嵌套三元运算符),但确实如此. (4认同)
  • 嗯非常酷.这使得`?:`相当于Javascript中的`||`! (3认同)

Gum*_*mbo 35

?:操作员是有条件的操作者(通常refered为三元运算符):

表达式(expr1) ? (expr2) : (expr3)求值为expr2if expr1计算为TRUE,expr3如果expr1求值为FALSE.

如果是:

expr1 ?: expr2
Run Code Online (Sandbox Code Playgroud)

表达式计算expr1if的expr1值为true,expr2否则:

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


Bol*_*wyn 5

看这里:

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

匿名函数:不,它们在5.3.0之前不存在(请参见示例下方的第一条注释),至少以这种方式:

function ($arg) { /* func body */ }
Run Code Online (Sandbox Code Playgroud)

唯一的方法是create_function(),它比较慢,相当麻烦且容易出错(因为使用字符串定义函数)。