如何将 PHP 三元表达式转换为 if-else?
How to convert PHP ternary expression to if-else?
我有以下使用条件运算符编写的代码片段:
$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')
}
谁能帮我看看我是否正确地进行了代码转换?如果我在此转换中有任何错误,请更正错误并告诉我错误。
不,转换应该是:
if ($this->request()->get('search'))
$iPage = $this->request()->getInt('req4');
elseif ($this->request()->getInt('req3'))
$iPage = $this->request()->getInt('req3');
else
$iPage = 1;
正确的转换是:
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
这是原始代码(使用条件运算符),格式更易读(根本不需要外括号):
$iPage = (
$this->request()->get('search') ?
$this->request()->getInt('req4') :
(
$this->request()->getInt('req3') ?
$this->request()->getInt('req3') :
1
)
);
第一步,我们将 $this->request()
提取到一个变量中;它使代码更易于阅读并且运行速度更快(避免四次执行相同的函数调用;它每次 returns 相同的值):
$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;
}
使用上述代码的任何转换;它们都提供相同的结果。
我个人更喜欢最后一个;它紧凑且易于阅读。
我有以下使用条件运算符编写的代码片段:
$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')
}
谁能帮我看看我是否正确地进行了代码转换?如果我在此转换中有任何错误,请更正错误并告诉我错误。
不,转换应该是:
if ($this->request()->get('search'))
$iPage = $this->request()->getInt('req4');
elseif ($this->request()->getInt('req3'))
$iPage = $this->request()->getInt('req3');
else
$iPage = 1;
正确的转换是:
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
这是原始代码(使用条件运算符),格式更易读(根本不需要外括号):
$iPage = (
$this->request()->get('search') ?
$this->request()->getInt('req4') :
(
$this->request()->getInt('req3') ?
$this->request()->getInt('req3') :
1
)
);
第一步,我们将 $this->request()
提取到一个变量中;它使代码更易于阅读并且运行速度更快(避免四次执行相同的函数调用;它每次 returns 相同的值):
$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;
}
使用上述代码的任何转换;它们都提供相同的结果。
我个人更喜欢最后一个;它紧凑且易于阅读。