是否有一种方法可以执行if中的每个函数,即使其中一个返回false


Is there a way to execute each function in an if, even if one returns false?

我想知道是否有我可以做的事情,除了设置每个函数为一个变量,然后在if中设置它以执行所有函数,即使第一个返回false(或第二个),结束if。

public function register($username, $email, $password) {
    if($this->validate_username($username) && $this->validate_email($email) && $this->validate_password($password)) {
        $this->User->register($username, $email, $this->password($password));
        return TRUE;
    }
    return FALSE;
}

基本上发生的事情是第一个函数($this->validate_username($username))返回false,因此其他函数没有被执行。问题是,如果其他参数也为false,它们会为用户设置错误。我真的不想把每个函数设置为一个变量(如果我必须的话),所以我想知道是否有另一种方式来表达if,以便其中一个函数是否返回true/false,所有这些函数都将被执行。

这没什么大不了的,如果有办法就好了。

可以使用位与运算符(&),它不会短路,而不是逻辑与运算符(&&),它会短路:

public function register($username, $email, $password) {
    if($this->validate_username($username) & $this->validate_email($email) & $this->validate_password($password)) {
        $this->User->register($username, $email, $this->password($password));
        return TRUE;
    }
    return FALSE;
}

在处理整数时,在幕后有一点语义上的区别;然而,当使用布尔值时,唯一的区别是所有的方法都将被调用,而不管它们每个的返回值是什么。

对我来说,即使你可以,你也不应该这样做,原因有二:

1)你让你的代码变得比你需要的更复杂,更难阅读,更难理解,更难返回。下一个试图弄明白它的作用的人几乎肯定是你。

2)如果您需要将它们全部作为业务逻辑的一部分执行,那么应该以某种方式清楚地封装。例如,您可以将这三个函数包装在另一个函数中,该函数的返回语句是条件检查。这将意味着在三个变量之上创建另一个函数:-)

例如:

function nicelyEncapsulatedBusinessLogic()
{
    a = test1();
    b = test2();
    c = test3();
    d = test4();
    return a && b && c && d;
}
function test()
{
    if(nicelyEncapsulatedBusinessLogic())
    {
        return true;
    }
    return false;
}

您可以尝试使用位操作符&而不是&&(逻辑)-应该运行所有的命令,然后计算if(…)

我不知道-您可以将函数重构为这样的东西(虽然有点长,但可以完成工作):

$return = true;
if( !$this->validate_username($username))
{
    $return = false;
}
if( !$this->validate_email($email))
{
    $return = false;
}
if( !$this->validate_password($password)) 
{
    $return = false;
}
if( $return)
{
    $this->User->register($username, $email, $this->password($password));
}
return $return;

问题是你想避免布尔运算符的短路行为。

。,因为如果第一个表达式为假,&&将为假,它将跳过第二个表达式,认为没有必要。

您需要重写函数以确保调用剩余的检查。