enum в PHP
12 мая 2008
Часто приходится иметь дело с определённым набором значений-параметров, которые можно передать какому-либо методу. Многие просто используют для этого строковые значения:
class Rights { function check($role, User $user){ return $user->role == $role; } }
Rights::check('adminisrator', $me);
Как видно из примера выше, ошибиться довольно легко, а вот ошибку найти будет довольно сложно.
Одно из возможных решений — завести псевдо-enum класс Roles:
class Roles { const ADMINISTATOR = 'administrator'; const USER = 'user'; } class Rights { function check($role, User $user){ return $user->role == $role; } }
Теперь вызов метода будет выглядеть так:
Rights::check(Roles::ADMINISTATOR, $me);
В случае описки компилятор нас предупредит.
Комментарии RSS по email OK
Забавно, на похожую тему сам сегодня в блог написал, но про python:)
я бы использовал
class Roles {
const ADMINISTATOR = 'administrator';
const USER = 'user';
}
class Rights {
function check($role, User $user){
}
}
Это уже от системы зависит.
А вот ещё идея:
abstract class Role
{
abstract get_Name();
}
class Admin extends Role
{
get_Name(){ return 'Администратор' }
}
class User extends Role
{
get_Name(){ return 'Польз' }
}
Теперь в сигнатурах методов можно указать что вх. параметр должен быть типа Role:
public func CheckRole(Role $rr, $usname)
{
<..>
}
Я на шарпе пишу, извините, если промашку допустил.
У вас опечатка :)
ADMINISTATOR != ADMINISTRATOR
В php для enum есть класс SplEnum
Описание enum
Нет его в PHP. Он есть в экспериментальном расширении
SPL_Types
, которое ещё и недоступно в виде dll под Windows.