我想知道我能做些什么,除了将每个函数设置为变量,然后在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 ,所有这些都将被执行。
这没什么大不了的 - 知道是否有办法真的很好。
答案 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,它会跳过第二个表达式。
您需要重写您的函数以确保调用剩余的检查。