PHP简写If / Else使用return时

时间:2013-08-27 20:12:30

标签: php shorthand

在PHP中编写shorthands的方法很简单。

不太常见但最短的例子:

!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];
}

我在这里做错了什么?如果第一个也是最短的例子在函数之外完美无缺,那么为什么它不能用于返回呢?

是否有可能使用返回的短线?

6 个答案:

答案 0 :(得分:29)

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

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

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

答案 1 :(得分:11)

你惊人的捷径实际上是相当可怕的代码。您正在滥用三元运算符,并且该代码实际上远比您写出来时更难以阅读且更难维护。人们期望三元进行测试并返回一个/或值。在其中执行分配不是正常行为。

答案 2 :(得分:11)

对于未来的googlers。

使用php 7 null coalesce(??)operator

return $data[0] ?? null; 

答案 3 :(得分:4)

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

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

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

出于这个原因,其他用户发布的内容更适合您的情况。

答案 4 :(得分:2)

oke我不知道你在做什么,但这应该有效:

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

答案 5 :(得分:1)

同意这里所回答的内容,一旦你离开它并且回来,或者更糟糕的是,未来的另一位开发者,这种速记更难以阅读。

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

特别是当主题或内容不是您熟悉的内容时,调试或添加内容会变得令人头痛。

这更容易管理,无论它是什么,它只是代码:

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

只是说