2015-02-13 2 views
0

Когда мне нужно пройти перечисление в функции PHP, я люблю:перечислений в Параметры функции

public function my_function (MyEnum $second) { 

    switch ($second->get_value()) { 
    case MyEnum::foo: 
    .... 
    } 
    .... 
} 

class MyEnum { 
    const foo = 0; 
    const bar = 1; 

    private $value; 

    public function __construct ($value) { 
    $this->value = $value; 
    } 

    public function get_value() { return $this->value; } 
} 

и называют как:

my_function(new MyEnum(MyEnum::foo)); 

Должен ли я изменить свою функцию, чтобы написать my_function(MyEnum::foo);?

Я продолжаю писать этот путь, потому что IDE показывают типы, когда автозаполнение вызова функции и php выбрасывают исключение, если вы используете другой тип в любом случае. Также он сглаживает процесс написания документации.

Итак, я думал, что у этого есть много преимуществ?

Но, возможно, письмо, поскольку последнее имеет другие преимущества или недостатки Я не знаю. Какими могут быть они?

+0

Что такое точка прохождения '$ первых 'to' my_function() '? –

+0

@MarkBaker нет точек, просто чтобы выглядеть естественным, я редактировал. – user544262772

+0

Я действительно не понимаю, почему вы используете столько кода, чтобы juste возвращал постоянное значение, вы могли бы использовать: 'constant ('MyEnum ::'. $ Const);'. Он вернет значение данного $ const (так что вам не нужно использовать переключатель) – Snroki

ответ

1

При создании нового MyEnum как так

my_function(new MyEnum(MyEnum::foo)); 

ваш IDE еще не будет в состоянии поймать проблема, возникающая, когда вы указываете несуществующий значение в конструктор:

my_function(new MyEnum(12345)); 

Хотя IDE не волнует, ваш код может быть не так счастлив.

Вы можете сохранить автозавершения кода IDE, предупреждение и улучшили безопасность путем реализации ваших перечислений в качестве иерархии классов вместо:

abstract class MyEnum 
{ 
    const foo = 1; 
    const bar = 2; 

    protected $value; 

    public function get_value() 
    { 
     return $this->value; 
    } 
} 

class Foo extends MyEnum { protected $value = MyEnum::foo; } 
class Bar extends MyEnum { protected $value = MyEnum::bar; } 

function my_function (MyEnum $second) 
{ 
    switch ($second->get_value()) { 
     case MyEnum::foo: 
      return 'foo'; 
      break; 
     case MyEnum::bar: 
      return 'bar'; 
      break; 
     default: 
      // This won't happen 
      break; 
    } 
} 

echo my_function(new Foo), PHP_EOL; 
echo my_function(new Bar), PHP_EOL; 

Выход:

foo 
bar 
+0

- это рекомендуемый синтаксис? – user544262772

+0

Ну, по крайней мере, это один из способов сделать это. Я видел его, и я часто использую его сам. Перечисления обсуждались ранее на этом сайте, например [здесь] (http://stackoverflow.com/questions/254514/php-and-enumerations), и все реализации имеют свои плюсы и минусы. – mhall

+0

спасибо моему человеку, бог держит тебя – user544262772

Смежные вопросы