Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否有一种方法可以执行if中的每个函数,即使其中一个函数返回false?_Php_Function_If Statement - Fatal编程技术网

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

Php 是否有一种方法可以执行if中的每个函数,即使其中一个函数返回false?,php,function,if-statement,Php,Function,If Statement,我想知道除了将每个函数设置为一个变量,然后在if中设置它以执行所有函数之外,是否还有什么可以做的,即使第一个函数返回false(或第二个),结束if public function register($username, $email, $password) { if($this->validate_username($username) && $this->validate_email($email) && $this->valida

我想知道除了将每个函数设置为一个变量,然后在
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,所有函数都将被执行


这没什么大不了的-知道有没有办法就好了。

我不知道-你可以将函数重组成这样(虽然有点长,但可以完成任务):

您可以使用(
&
),而不是逻辑AND运算符(
&&
),逻辑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;

}

在处理整数时,在幕后有一点语义上的差异;但是,在使用布尔运算时,唯一的区别是,无论每个方法返回的值是多少,都将调用所有方法。

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

问题是您希望避免布尔运算符的短路行为

i、 例如,因为如果第一个表达式为false,则
&&
将为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;
}

另外,从技术上讲,“有效”类型的函数不应该执行业务逻辑,它们应该只是检查有效性。否则,您将混淆各职能部门的职责。目前,您的validate_用户名所做的似乎不仅仅是验证它…?是的,它所做的不仅仅是验证,它还为模板系统设置了一个警告,以便用户知道他们做错了什么<代码>$this->View->set_警告('error_username','Sorry,但该用户名已被使用','error')另外,感谢您提供的提示。
test()
是否意味着要成为不必要代码的示例?调用
test()
将始终产生与调用
nicely-encloseddedbusinesslogic()
Well-spoted Null:-)相同的结果,但是测试方法只是为了显示Josh如何执行评估,同时确保执行所有操作。事实上,我认为该测试将根据if语句的结果执行一些操作。不过很对!
function nicelyEncapsulatedBusinessLogic()
{
    a = test1();
    b = test2();
    c = test3();
    d = test4();

    return a && b && c && d;
}

function test()
{
    if(nicelyEncapsulatedBusinessLogic())
    {
        return true;
    }

    return false;
}