多条件IF语句

时间:2011-03-17 11:13:15

标签: php if-statement

我有一个带有多个条件的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,无论公司或状态如何

5 个答案:

答案 0 :(得分:4)

这个怎么样:

if (
  (isset($_SESSION['status']) && $_SESSION['username']=="qqqqq")
  || (isset($_SESSION['status']) && in_array($_SESSION['company'], array('wwwwww', 'ffffffff', 'ggggggg', 'hhhhhhh')))
  || $_SESSION['LOGINTYPE']=="ADMIN"
)

重写条件以使其更容易阅读可能会有所帮助:

  • 每行一个可能的案例:
    • 状态设置和用户名确定
    • 状态设置和公司确定
    • 管理员
  • 使用in_array而不是对公司进行多次测试 - 我认为它更容易理解

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