【问题标题】:PHP Shorthand If/Else when using return使用返回时的 PHP 速记 If/Else
【发布时间】:2013-08-30 17:44:19
【问题描述】:

在 PHP 中编写速记的好方法很少。

不太常见但最短的例子:

!isset( $search_order ) && $search_order = 'ASC';

更常见但更长一点:

!isset( $search_order ) ? $search_order = 'ASC' : $search_order = NULL;

我们甚至可以将上面的例子组合成一个惊人的速记:

!isset( $_POST['unique_id'] ) && preg_match( '/^[a-zA-Z0-9]{8}$/', $_POST['unique_id'] ) ? $post_unique_id = $_POST['unique_id'] : $post_unique_id = NULL;


但是我们如何将上面的示例与函数和返回一起使用,示例:

function filter_gender_request($data) {  
    preg_match('/(fe)?male/i', $data, $data);
    isset($data[0]) && return $data[0]; // It doesn't work here with return
}

同时,如果我陈述以下内容,而不是 isset($data[0]) && return $data[0];,那么一切都会按预期进行:

if (isset($data[0]) ) {
    return $data[0];
}

我在这里做错了什么?如果第一个也是最短的示例在函数之外完美地工作,那么为什么它不能与 return 一起工作?

是否有可能在 return 中使用速记?

【问题讨论】:

  • 您展示的简洁代码可读性较差,因此代码更差。通过写出if 语句,免去您必须破译您原本要写的内容的麻烦。
  • 就我个人而言,我使用:$search_order = (!isset( $search_order ) ? 'ASC' : NULL);
  • 我不确定这样写能保存什么 - 10 次击键? Here is a good piece of advice to code by.
  • 阅读!isset( $search_order ) && $search_order = 'ASC';有什么问题那么速记有什么意义呢?

标签: php shorthand


【解决方案1】:

使用您当前的语法,当$data[0] 未设置时,您希望您的函数返回什么?当然,您不希望您的函数返回任何东西,具体取决于条件。

我看到的唯一替代方法是 ternary operator,如果未设置,则返回 $data[0] 以外的其他内容:

return isset($data[0]) ? $data[0] : null; 

【讨论】:

  • 谢谢,尼克!我想,我试过这个;你的例子有效!我不在乎此时是否设置为NULL,因为它将在稍后处理,如果未设置,它将被设置为NULL
  • @IliaRostovtsev,这可能是您最好的选择,也是实现您的结果的最直接方法。不要忘记选择正确的答案,这样您的问题就不会在未回答的边缘徘徊。
  • 杰森,不会的!我从来没有真正忘记!谢谢大家,伙计们!! :)
【解决方案2】:

对于未来的谷歌员工。

使用 php 7 null coalesce (??) 运算符

return $data[0] ?? null; 

【讨论】:

  • 感谢分享。
【解决方案3】:

你惊人的快捷方式实际上是相当可怕的代码。您正在滥用三元运算符,并且该代码实际上远不如您写出来的代码可读性和可维护性差。人们期望三元组执行测试并返回一个非此即彼的值。在其中执行分配不是正常行为。

【讨论】:

  • 你说得很好。代码确实很聪明,但维护它会很痛苦
  • 谢谢,马克,我同意!无论如何,如果使用快捷方式是一种滥用,那么首先使用快捷方式有什么意义?
  • 用于设置默认值的新$foo = isset($foo) ?: 'default value' 是一个非常方便的快捷方式。但这并没有滥用语法,因为它是 PHP 5.4 的内置语言功能。至于其他快捷方式,!isset(...) && $foo = 'bar' 在我看来是错误的,因为这一切都隐含着if() 条件。看到 if() 中的赋值操作在我脑海中敲响了警钟。我自动将其视为“应该是 $foo == 'bar'”。
  • 马克,非常感谢您的精彩解释,谢谢!!
  • 这里有一个关于这个答案的公开 Meta 讨论:Review audit seems wrong
【解决方案4】:

您的代码的问题是您试图将return 语句作为三元表达式的一部分执行。三元运算符通常会产生如下赋值:

$message = is_error() ? get_error() : 'No Errors';

这会导致基于is_error() 的返回值分配给$message。您的代码正在尝试处理操作中的程序控制语句。 return 不能分配给变量。

因此,其他用户发布的内容更适合您的情况。

【讨论】:

    【解决方案5】:

    好吧,我不知道你在做什么,但这应该可以:

    return ( isset($data[0]) ? $data[0] : false);
    

    【讨论】:

      【解决方案6】:

      同意这里的回答,一旦你离开它并回来,或者更糟的是,未来的另一个开发人员,这个速记就更难阅读了。

      想象一下,即使是一个 500 行的小脚本文件,还有 40 行的速记 elseif,当你使用它时,你可以尝试添加或更改代码吗?

      特别是当主题或内容不是你熟悉的东西时,调试或添加变得很头疼。

      这更易于管理,不管它是什么,它只是代码:

      if ($var == 'unicorns')
        {
          $this->remove_horn;
        }
      elseif ($var == 'horse')
       {
         $this->glue_on_horn;
       }
      else
        {
          $this->must_be_a_zebra;
        }
      

      只是说

      【讨论】:

      • 您是否认为在代码和开发中有时不应该考虑可维护性?即使是一个快速的脚本,一个做一件事的小页面,也应该是整洁的,格式良好的和编码的最佳实践,遵守当前和未来的标准,并且是可维护的......
      • 在这种情况下,您的示例应该使用 switch 语句。
      • 我认为那是您的个人喜好,归根结底就是这样。此外,OP 使用 ifelse... ;)
      猜你喜欢
      • 2014-08-08
      • 2016-10-06
      • 2011-07-17
      • 2016-12-26
      • 2016-05-15
      • 2013-04-08
      • 2011-12-26
      • 1970-01-01
      • 2013-07-18
      相关资源
      最近更新 更多