【问题标题】:How to convert PHP ternary expression to if-else?如何将 PHP 三元表达式转换为 if-else?
【发布时间】:2015-07-05 14:21:25
【问题描述】:

我已经关注了使用条件运算符编写的 sn-p 代码:

$iPage=($this->request()->get('search') ? $this->request()->getInt('req4') : ($this->request()->getInt('req3') ? $this->request()->getInt('req3') : 1 ));

我将其转换为 if-else 格式如下:

if($this->request()->get('search')) {
  $this->request()->getInt('req4')
} else {
  ($this->request()->getInt('req3')
}

有人能帮我告诉我是否正确地进行了代码转换吗?如果我在此转换中犯了任何错误,请更正错误并让我知道错误。

【问题讨论】:

  • 为什么不自己测试一下,看看有没有错?
  • @Epodax : 坦率地说,我只是对给出的声明中的条件太多感到困惑,所以请帮忙。
  • value 1 将无法返回.. 它应该是处于最后一个条件的那个.. else

标签: php if-statement conditional-operator code-conversion


【解决方案1】:

这是原始代码(使用条件运算符)格式化为更具可读性(根本不需要外括号):

$iPage = (
    $this->request()->get('search') ?
    $this->request()->getInt('req4') :
    (
        $this->request()->getInt('req3') ?
        $this->request()->getInt('req3') :
        1
    )
);

在第一步中,让我们将$this->request() 提取到一个变量中;它使代码更易于阅读并且运行速度更快(避免执行四次相同的函数调用;它每次返回相同的值):

$request = $this->request();
$iPage = (
    $request->get('search') ?
    $request->getInt('req4') :
    (
        $request->getInt('req3') ?
        $request->getInt('req3') :
        1
    )
);

现在,让我们将条件句替换为if/then/else

$request = $this->request();
if ($request->get('search')) {
    $iPage = $request->getInt('req4');
} else {
    if ($request->getInt('req3')) {
        $iPage = $request->getInt('req3');
    } else {
        $iPage = 1;
    }
}

现在,让我们注意1 的值是$iPage 的默认值。如果满足有关请求的某些条件,则使用$request 的值计算$iPage 的值;否则$iPage 变为1。让我们提取这些信息并简化代码:

// Default value 
$iPage = 1;
// Get the request into a variable for faster and shorter code
$request = $this->request();
// If 'search' is set, use 'req4' else use 'req3'
if ($request->get('search')) {
    $iPage = $request->getInt('req4');
} else {
    if ($request->getInt('req3')) {
        $iPage = $request->getInt('req3');
    }
}

现在我们可以将else 与它包含的if 组合成:

// Default value 
$iPage = 1;
// Get the request into a variable for faster and shorter code
$request = $this->request();
// If 'search' is set, use 'req4' else use 'req3'
if ($request->get('search')) {
    $iPage = $request->getInt('req4');
} elseif ($request->getInt('req3')) {
    $iPage = $request->getInt('req3');
}

如果我们将默认值放回 if/else 构造中,您可能会觉得更容易理解,如下所示:

// Get the request into a variable for faster and shorter code
$request = $this->request();
if ($request->get('search')) {
    // If 'search' is provided, use 'req4'
    $iPage = $request->getInt('req4');
} elseif ($request->getInt('req3')) {
    // else, use 'req3' if provided
    $iPage = $request->getInt('req3');
} else {
    // else default to 1
    $iPage = 1;
}

或者,如果您不介意使用条件运算符(并获得更紧凑的代码),您可以使用 PHP 5.3 ("Since PHP 5.3, it is possible to leave out the middle part of the ternary operator" ):

// Get the request into a variable for faster and shorter code
$request = $this->request();
// If 'search' is provided, use 'req4' 
if ($request->get('search')) {
    $iPage = $request->getInt('req4');
} else {
    // Use 'req3' if provided else default to 1
    $iPage = $request->getInt('req3') ?: 1;
}

使用上述任何代码转换;它们都提供相同的结果。
我个人更喜欢最后一个;它结构紧凑,易于阅读。

【讨论】:

    【解决方案2】:

    正确的转换是:

    if ($this->request()->get('search') {
        $iPage = $this->request()->getInt('req4');
    } else {
        if $this->request()->getInt('req3') {
            $iPage = $this->request()->getInt('req3');
        } else {
            $iPage = 1;
        }
    }
    

    但是你可以合并第一个 else 和第二个 if,使其成为 elseif

    【讨论】:

    • if 语句缺少括号。 ;-)
    【解决方案3】:

    不,转换应该是:

    if ($this->request()->get('search'))
        $iPage = $this->request()->getInt('req4');
    elseif ($this->request()->getInt('req3'))
        $iPage = $this->request()->getInt('req3');
    else
        $iPage = 1;
    

    【讨论】:

      猜你喜欢
      • 2017-09-13
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2012-07-11
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多