эмуляция типа Enum в PHP 5

xconfigurator

Новичок
эмуляция типа Enum в PHP 5

приветствую,
народ, собственно хочу иметь удобную эмуляцию enum в коде, с учётом отсутсвия слишком больших и необоснованных накладных расходов в производительности из-за этих украшений.
вобщем, если кто-то "заморачивался" на подобные темы, скажите, как лично вы сие делали.

сейчас мне видятся следующие варианты (я хочу иметь логическую группировку констант по "доменам")

1.
PHP:
class NotifyState {
 const SENT = 0;
 const RECV = 1;
 const TIMEOUT = 3;
}
2.
PHP:
 $NotifyState = array("SENT"=>0,
     "RECV"=>1,
    "TIMEOUT"=>3);
3.
PHP:
 if (!defined("SENT"))
    define("SENT", 0);
...
из вышеперечисленных, лично мне ближе 1-й
PHP:
if ($notify->state == NotifyState::SENT) {
...
}
как-то более естественно выглядит (или просто привычка к "Плюсам"), однако, насколько будет оправдано расходование выч. ресурсов на все эти классы... т.е. если у меня порядка 100 типов перечислений, как вы считаете, стоит отказаться от такого подхода?

ессно, тесты и ещё раз тесты, но возможно кто-то уже их сделал ;)

вобщем, расскажите, как вы делаете.
 

Alexandre

PHPПенсионер
из вышеперечисленных, лично мне ближе 3-й

По накладным расходам хеш-массив чуть меньше чем класс (объект).
Но это ИМХО - тестов не делал.
Смотрел исходники, классы реализованы как хеш массивы, тольк чуточку сложнее.
 

Solid

Drosera anglica
По идее, правильнее всего использовать 1-ый способ. Доступ к константам класса производится на ~20% медленнее, чем к хешам или обычным глобальным константам. В любом случае, лучше использовать более правильный способ (даже если он влияет на производительность), т.к. удобство превыше всего... а так же не вызывало никаких конфликов.
 

xconfigurator

Новичок
всем спасибо за комментарии! мда, 1й способ действительно более удобный (ИМХО), и я пользуюсь именно этим, однако, он не пригоден для "вложенных" поддоменов констант, например:

PHP:
catch {
    $debug->traceStack(SEH::UNKNOWN_EXCEPTION::TRACE_LEVEL);
}
примерно соответствует следующему:

PHP:
abstract class SEH {
    ...
    abstract class UNKNOWN_EXCEPTION {
         const TRACE_LEVEL = 5;
         ....
    }
    ....
}
в PHP, на сколько мне известно, вложенных классов не существует, хотя, быть может возможен какой-либо хак, неописанный в официальном мане?
 

Solid

Drosera anglica
xconfigurator
Это уже Java какая-то... а для чего? Хотите создать namespace'ы?
http://phpnamespaces.org/wiki/
http://www.petitiononline.com/phpns/petition.html - петиция к разработчикам ядра PHP, по поводу внедрения namespace'ов. Только это, скорее всего, никогда не произойдёт.

-~{}~ 06.12.06 15:31:

В таком случае лучше всего define.
 

xconfigurator

Новичок
Автор оригинала: Solid
...а для чего?
для удобства...
за http://phpnamespaces.org/wiki/ большое спасибо, но на хостингах подобное не прокатит... так, для себя разве что.

мда, неймспейсы/юзинги/алиасы, дефайны и тайпдефы не помешали бы естественно. не думаю, что это "усложнило" или утяжелило бы PHP...

вобщем, всем спасибо.
 
Сверху