12

在 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 中使用速记?

4

6 回答 6

35

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

我看到的唯一替代方法是三元运算符,您在其中返回其他$data[0]内容,而不是未设置时:

return isset($data[0]) ? $data[0] : null; 
于 2013-08-27T20:14:53.020 回答
24

对于未来的谷歌人。

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

return $data[0] ?? null; 
于 2017-05-19T08:52:53.547 回答
11

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

于 2013-08-27T20:16:31.147 回答
4

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

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

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

因此,其他用户发布的内容对于您的情况来说是更好的选择。

于 2013-08-27T20:31:26.447 回答
2

好的,我不知道您在做什么,但这应该可行:

return ( isset($data[0]) ? $data[0] : false);
于 2013-08-27T20:19:24.753 回答
1

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

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

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

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

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

只是说

于 2013-08-27T20:26:14.930 回答