这是我的代码的一部分......我必须获得多种方法的返回值并继续进行。所有方法都返回true或false。 我发现if的深度嵌套。
if($this->user_exists()){
if($this->check_password()){
if($this->check_user_type()){
if($this->initiate_session()){
...
and so on...
...
}else{
return false;
$this->error_array[] = 'Problem in initiating session.';
}
}else{
return false;
$this->error_array[] = 'User type could not be determined.';
}
}else{
return false;
$this->error_array[] = 'Wrong password.';
}
}else{
return false;
$this->error_array[] = 'User does not exist.';
}
有没有办法做到这一点 -
$checking_steps = array('user_exists','check_password','check_user_type','initiate_session',...);
$i = 0;
foreach($checking_steps as $method){
++$i;
$return_of_the_method
if(return_of_the_method === false){
break;
}
}
if(count($checking_steps) === $i && empty($this->error_array)){
return true;
}else{
return false;
}
我不知道迭代返回类的方法。
答案 0 :(得分:3)
PHP很容易允许动态方法调用。您可以循环遍历调用它们的方法列表,并在每个步骤中处理结果。
$checking_steps = array(
'user_exists' => 'User does not exist.',
'check_password' => 'Wrong password.',
'check_user_type' => 'User type could not be determined.',
'initiate_session' => 'Problem in initiating session.',
);
foreach ($checking_steps as $method => $message) {
$result = $this->$method();
if ($result === false) {
$this->error_array[] = $message;
break;
}
}
if (empty($this->error_array)) {
return true;
} else {
return false;
}
答案 1 :(得分:2)
这是PHP的动态语言发挥作用。 您可以执行以下操作:
<?php
class Steps
{
private $checking_steps = array('user_exists', 'check_password', 'check_user_type', 'initiate_session');
public function doLogic()
{
$i = 0;
foreach ($this->checking_steps as $method) {
++$i;
$result = $this->{$method}();
if ($result === false) {
break;
}
}
}
private function user_exists()
{
return false;
}
}
$class = new Steps();
$class->doLogic();
以上是一个例子。
答案 2 :(得分:1)
您可以使用try{} catch() {}
的强大功能来避免金字塔检查,如下所示:
<?php
try
{
if( ! $this->user_exists() )
{
throw new Exception('User does not exist.');
}
else if( ! $this->check_password() )
{
throw new Exception('Wrong password.');
}
else if( ! $this->check_user_type() )
{
throw new Exception('User type could not be determined.');
}
else if( ! $this->initiate_session() )
{
throw new Exception('Problem in initiating session.');
}
else if( ! $this->my_other_function() )
{
throw new Exception('My other exception message.');
}
// all clear, do your job here ...
}
catch(Exception $e)
{
$this->error_array[] = $e->getMessage();
return false;
}
?>