<rmcreative>

RSS

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

  1. Забавно, на похожую тему сам сегодня в блог написал, но про python:)

  2. №305
    Кирилл
    Кирилл 31.05.2008, 20:47:39

    я бы использовал

    class Roles {

    const ADMINISTATOR = 'administrator';

    const USER = 'user';

    }

    class Rights {

    function check($role, User $user){

    return in_array($role,$user->role);
    
    

    }

    }

  3. №306
    Sam
    Sam 02.06.2008, 12:27:55

    Это уже от системы зависит.

  4. №1648
    Андрей Стельмах
    Андрей Стельмах 19.06.2009, 12:06:47

    А вот ещё идея:

    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)

    {

    <..>

    }

    Я на шарпе пишу, извините, если промашку допустил.

  5. №2559
    Sasha
    Sasha 19.05.2010, 16:27:27

    У вас опечатка :)

    ADMINISTATOR != ADMINISTRATOR

  6. №8221
    Knase
    Knase 31.07.2013, 20:54:10

    В php для enum есть класс SplEnum

    class Roles extends SplEnum {
      const ADMINISTATOR = 'administrator';
      const USER = 'user';
    }

    Описание enum

  7. №8222
    Sam
    Sam 31.07.2013, 22:07:54

    Нет его в PHP. Он есть в экспериментальном расширении SPL_Types, которое ещё и недоступно в виде dll под Windows.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.