不存在的常量返回true


Non-existent constant return true

每次用户登录时,我都会提取一个包含权限的序列化数组。当我取消数组的序列化并尝试将每个权限分配给一个常量时,不存在的常量将返回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();

我的数组($permissions)是:

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
  • 用户更新:1
  • USERS_CREATE:USERS_CREATE
  • USERS_DELETE:USERS_DELETE

因此,在这种情况下,一切都返回TRUE。

知道吗?

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

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

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

或者,你可以这样做:

function userHasPermission( $permission ) {
    return constant($permission) === 1;
}

顺便说一句,使用"动态常数"听起来像是一个你可能需要重新思考的设计想法。常数通常是常数:)