Каждый раз, когда пользователь входит в систему, я извлекаю сериализованный массив, содержащий права. Когда я десериализирую массив и пытаюсь присвоить каждое право константе, несуществующие константы возвращают 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/>
Когда я повторяю константы …
Таким образом, все возвращает TRUE в этом случае.
Любая идея ?
Как правило, в PHP не найденные константы превращаются в строки с одинаковыми именами. Таким образом, попытка использовать константу «USERS_READ» становится строкой «USERS_READ» при попытке ее использования. Строка ‘USERS_READ’ при преобразовании в логическое значение будет истинной.
Итак, вам нужно использовать метод defined
чтобы проверить, существует ли он, прежде чем пытаться оценить константу:
http://php.net/manual/en/function.defined.php
Или вы можете сделать что-то вроде этого:
function userHasPermission( $permission ) {
return constant($permission) === 1;
}
Кстати, добавление «динамическая константа» звучит как идея дизайна, которую вы, возможно, захотите переосмыслить. Константы обычно постоянны 🙂
Других решений пока нет …