不存在的常量返回true

时间:2015-03-02 16:08:06

标签: php constants

每次用户登录时,我都会提取包含权限的序列化数组。当我反序列化数组并尝试将每个权限分配给常量时,不存在的常量返回TRUE。例如,这是我对数据库的调用:

    $req_level = $pdo->prepare('SELECT * FROM users_levels WHERE level_id = ?');
    $req_level->execute(array($row['level_id']));
    $row_level = $req_level->fetch();
    $user_level_name = $row_level['name'];
    $permissions = unserialize($row_level['permissions']);
    foreach ($permissions as $permission) {
        define(strtoupper($permission), 1);
    }
    $req_level->closeCursor();

我的数组($权限)是:

Array ( [0] => users_read [1] => users_update [2] => customers_read [3] => customers_update )

当我调用所有可能的常量时,对于那些现有的常量我应该为TRUE,对于那些不存在的常量应该为FALSE,但这是我得到的...

USERS_READ : <?=USERS_READ?> <br/>
USERS_UPDATE : <?=USERS_UPDATE?> <br/>
USERS_CREATE : <?=USERS_CREATE?> <br/>
USERS_DELETE : <?=USERS_DELETE?> <br/>

当我回显常数时......

  • USERS_READ:1
  • USERS_UPDATE:1
  • USERS_CREATE:USERS_CREATE
  • USERS_DELETE:USERS_DELETE

所以在这种情况下一切都返回TRUE。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

通常,在PHP中,未找到的常量将转换为具有相同名称的字符串。因此,尝试使用常量'USERS_READ'时,会尝试使用字符串'USERS_READ'。转换为布尔值时,字符串'USERS_READ'将为true。

因此,在尝试评估常量之前,您需要使用方法defined来检查它是否存在:

http://php.net/manual/en/function.defined.php

或者,您可以这样做:

function userHasPermission( $permission ) {
    return constant($permission) === 1;
}
顺便说一句,在旁注上,使用“动态常量”听起来像是一个设计理念,你可能想重新考虑一下。常数通常是常数:)