不存在的常量 return true
Non-existent constant return true
每次用户登录时,我都会提取一个包含权限的序列化数组。当我反序列化数组并尝试将每个权利分配给一个常量时,不存在的常量 return 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
- USERS_UPDATE : 1
- USERS_CREATE : USERS_CREATE
- USERS_DELETE : USERS_DELETE
所以在这种情况下一切 return 都是正确的。
有什么想法吗?
通常,在PHP中,未找到的常量会变成同名的字符串。因此,尝试使用常量 'USERS_READ' 时会变成字符串 'USERS_READ'。字符串 'USERS_READ' 转换为布尔值时将为真。
因此,您需要使用方法 defined
以在尝试计算常量之前检查它是否存在:
http://php.net/manual/en/function.defined.php
或者,您可以这样做:
function userHasPermission( $permission ) {
return constant($permission) === 1;
}
顺便说一句,使用 "dynamic constant" 听起来像是您可能需要重新考虑的设计理念。常数通常是常数:)
每次用户登录时,我都会提取一个包含权限的序列化数组。当我反序列化数组并尝试将每个权利分配给一个常量时,不存在的常量 return 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
- USERS_UPDATE : 1
- USERS_CREATE : USERS_CREATE
- USERS_DELETE : USERS_DELETE
所以在这种情况下一切 return 都是正确的。
有什么想法吗?
通常,在PHP中,未找到的常量会变成同名的字符串。因此,尝试使用常量 'USERS_READ' 时会变成字符串 'USERS_READ'。字符串 'USERS_READ' 转换为布尔值时将为真。
因此,您需要使用方法 defined
以在尝试计算常量之前检查它是否存在:
http://php.net/manual/en/function.defined.php
或者,您可以这样做:
function userHasPermission( $permission ) {
return constant($permission) === 1;
}
顺便说一句,使用 "dynamic constant" 听起来像是您可能需要重新考虑的设计理念。常数通常是常数:)