有没有办法在if中执行每个函数,即使返回false也是如此?

时间:2011-11-07 07:25:25

标签: php function if-statement

我想知道我能做些什么,除了将每个函数设置为变量,然后在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,因此其他函数没有被执行。问题是,如果其他的也是假的,他们会为用户设置错误。我真的不想将每个函数设置为一个变量(如果必须的话),所以我想知道是否还有另一种方法来说明if,以便其中一个函数返回true / false ,所有这些都将被执行。

这没什么大不了的 - 知道是否有办法真的很好。

5 个答案:

答案 0 :(得分:3)

可以使用bitwise AND operators&),而不是short-circuit,而不是逻辑AND运算符(&&) :

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 :(得分:3)

对我而言,即使你可以,也不应该,原因有两个:

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

答案 2 :(得分:2)

您可以尝试使用按位运算符&而不是&& (逻辑) - 应运行所有命令,然后评估if(...)

答案 3 :(得分:0)

不是我所知道的 - 你可以将功能重组为这样的东西(虽然有点冗长但完成工作):

$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;

答案 4 :(得分:0)

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

即,因为如果第一个表达式为false,&&将为false,它会跳过第二个表达式。

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