【问题标题】:What is ?: in PHP 5.3? [duplicate]什么是?:在 PHP 5.3 中? [复制]
【发布时间】:2011-01-10 07:47:06
【问题描述】:

可能重复: What are the PHP operators “?” and “:” called and what do they do?

来自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. 在 PHP 5.3 中,数字 2 对 ?: 有什么作用?

  2. 另外,匿名函数是什么意思?那不是早就存在了吗?

【问题讨论】:

  • @gordon,我知道这对这些主题意味着什么,我认为这是不同的,因为该网站说它是 5.3 的新功能,而且我从未像“?:”那样看到它们在一起跨度>
  • @Gordon 这些只是较长的形式。 @jasondavis,你有 : 和 ?在问题标题中倒退。
  • 啊好吧。 是你可以省略中间部分。匿名函数(lambda 和闭包)也是 5.3 的新增功能,尽管您之前可以使用 create_function 创建函数。
  • 这不是重复的。

标签: php php-5.3 ternary-operator conditional-operator language-construct


【解决方案1】:

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

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

【讨论】:

  • 谢谢!当我看到他们像“?:”那样在一起时,我感到很困惑,我搜索但找不到任何东西。
  • 嗯,很酷。这使得 ?: 等同于 Javascript 中的 ||
  • 作为额外的奖励,您可以“链接”它们: $foo = $bar ?: $bazz ?: $yadda ?: $qux; // $foo 将被分配第一个真实变量的值。不确定这是否是一个糟糕的想法(有些人不喜欢嵌套三元运算符),但确实如此。
  • @MSpreij 我会说这是它的简洁用法。通常,嵌套三元运算符很糟糕,是的(在某些情况下我会原谅最多一个嵌套层)。上述替代方案将是一个非常长且丑陋的 if/elseif/else 块,这确实是一种浪费。只要有诸如您为没有经验的程序员提供的评论,那么我会发现这种链接完全可以接受(实际上我很高兴使用它,感谢您指出!)。
  • @MSpreij 实际上,为了进一步证明这不是一个糟糕的想法,PHP 7 引入了 null coalescing operator(我自己忘记了),它做了类似的事情并且具有相同的通用语法 -区别在于 isset() 与真实值。
【解决方案2】:

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

如果expr1 计算结果为TRUE,则表达式(expr1) ? (expr2) : (expr3) 计算结果为expr2,如果expr1 计算结果为FALSE,则表达式expr3

如果是:

expr1 ?: expr2

如果expr1true,则表达式计算为expr1 的值,否则为expr2

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

【讨论】:

    【解决方案3】:

    Look here:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2023-03-17
      • 2012-11-27
      • 2011-05-04
      • 2011-05-06
      相关资源
      最近更新 更多