我有一个带有多个条件的if语句,我似乎无法正确
if(((ISSET($_SESSION['status'])) && ($_SESSION['username']=="qqqqq")) ||
((ISSET($_SESSION['status'])) && ($_SESSION['company']=="wwwwww")) ||
((ISSET($_SESSION['status'])) && ($_SESSION['company']=="ffffffff")) ||
((ISSET($_SESSION['status'])) && ($_SESSION['company']=="ggggggg")) ||
((ISSET($_SESSION['status'])) && ($_SESSION['company']=="hhhhhhh")) ||
($_SESSION['LOGINTYPE']=="ADMIN")) {
如果设置状态和其中任何一个公司名称,它应该返回true如果logintype是admin,它应该返回true,无论公司或状态如何
答案 0 :(得分:4)
这个怎么样:
if (
(isset($_SESSION['status']) && $_SESSION['username']=="qqqqq")
|| (isset($_SESSION['status']) && in_array($_SESSION['company'], array('wwwwww', 'ffffffff', 'ggggggg', 'hhhhhhh')))
|| $_SESSION['LOGINTYPE']=="ADMIN"
)
重写条件以使其更容易阅读可能会有所帮助:
答案 1 :(得分:2)
至少,重做它,以便读取你所说的应该做的事情:
如果设置状态和其中任何一个公司名称,它应该返回true如果logintype是admin,它应该返回true,无论公司或状态如何
function mayAccessResource(array $sessionState)
{
return (hasStatus($sessionState) && isAllowedUserOrCompany($sessionState))
|| isAdmin($sessionState);
}
然后为封装单个测试的那些添加方法:
function hasStatus($sessionState)
{
return isset($sessionState['status']);
}
function isAllowedUserOrCompany($sessionState)
{
return isAllowedUser($sessionState) || isAllowedCompany($sessionState);
}
function isAllowedUser($sessionState)
{
return isset($sessionState['user'])
&& $sessionState['user'] === 'blah';
}
function isAllowedCompany($sessionState)
{
$allowedCompanies = array('foo', 'baz', 'baz');
return isset($sessionState['company'])
&& in_array($sessionState['company'], $allowedCompanies);
}
function isAdmin($sessionState)
{
return isset($sessionState['LOGINTYPE'])
&& $sessionState['LOGINTYPE'] === 'admin';
}
这仍然远非完美,因为它硬编码太多信息,但至少它现在更具可读性。由于所有这些都在会话状态上运行,因此有一个对象SessionState会更漂亮。更好的方法是将各种可能的会话状态分开,并拥有Company,User和AccessControl类。
另请注意您问题下方的评论。
答案 2 :(得分:1)
某些格式化会使思维解析更加容易=)另外,您可以通过创建一系列允许的公司来简化公司方面的事情。一次测试一次会使if()难以维护和阅读 - 每次添加公司都有可能破坏逻辑。
此外,看起来如果$_SESSION['LOGINTYPE'] == 'ADMIN'
,这是一个应该始终为true的覆盖,否则你总是需要设置$ _SESSION ['status']。
$companies = array(
'wwww'=>true,
'ffff'=>true,
'gggg'=>true,
'hhhh'=>true
);
if (
$_SESSION['LOGINTYPE'] == 'ADMIN'
|| isset($_SESSION['status'])
&& (
$_SESSION['username'] == 'qqqqq'
|| isset($companies[$_SESSION['company']])
)
) {
...
}
或者可能更清楚:
$pass = false;
if ($_SESSION['LOGINTYPE'] == 'ADMIN') {
$pass = true;
} else if (isset($_SESSION['status'])) {
if ($_SESSION['username'] == 'qqqq') $pass = true;
if (isset($companies, $_SESSION['company']) $pass = true;
}
if ($pass) {
...
}
答案 3 :(得分:1)
另一种选择:
if (!$_SESSION['LOGINTYPE']=="ADMIN") {
return false;
}
if (!ISSET($_SESSION['status']) {
return false
}
if ($_SESSION['username']=="qqqqq") {
return true;
}
// etc
或者从第三个条件开始使用开关。
更好的方法是使这个面向对象:
if ($this->user->isAdmin()) || $this->user->belongsToCompany($this->allowedCompanies)
通过创建“更高级别的语言”可以更好地阅读。
注意:这不是关于在尽可能少的行上获得最少的字符。
答案 4 :(得分:0)
为什么不使用try-catch-blocks并在案例变为真时将变量设置为true?
阅读和维持更加清晰。
try($foo) {
catch x:
$bar = true;
default:
$bar = false;
}