2016-05-07 3 views
1

я читал здесь о enumarations и их «внедрения»PHP-тип намекания с перечислениями?

PHP and Enumerations

точка, почему использование перечислений, если не для типа намекая?

но эта реализация не позволяет использовать для типа намекания. Поскольку записи перечисления - это все строки.

есть способ, которым я могу сказать

function($a){ 

} 

$a должен быть 'foo', 'bar' или 'baz'

в PHP?

Я использую phpstorm/intellij, поэтому, если есть другой способ сделать это, я тоже буду в порядке. Например. скажем, в документе, но с маской autocompletion от phpstorm, возможно, скомпилировать ошибки

ответ

2

В PHP нет встроенного способа, требующего, чтобы переданная строка имела определенное значение; даже в PHP7. Вы можете набирать типы объектов и массивы, о которых я знаю. Перечисления решат эту проблему, но PHP не поддерживает перечисления.

Если вам действительно нужно это, возможно, вам стоит подумать о строго типизированном языке программирования.

Если вы застряли с PHP

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

Попробуйте

<?php 

class WeekDay { 
    private $value; 

    public function __construct($value) { 
     if (!in_array($value, ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])) 
      throw new Exception("Not a week day."); 
     else 
      $this->value = $value; 
    } 

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

function echoWeekDay(WeekDay $weekDay) { 
    echo $weekDay . "\n"; 
} 

echoWeekDay(new WeekDay("Tuesday")); 
echoWeekDay(new WeekDay("Saturday")); 

Запуск с

~/Code/stack-overflow $ php enums.php 
Tuesday 
PHP Fatal error: Uncaught exception 'Exception' with message 'Not a week day.' in /Users/marianol/Code/stack-overflow/enums.php:8 
Stack trace: 
#0 /Users/marianol/Code/stack-overflow/enums.php(23): WeekDay->__construct('Saturday') 
#1 {main} 
    thrown in /Users/marianol/Code/stack-overflow/enums.php on line 8 

Fatal error: Uncaught exception 'Exception' with message 'Not a week day.' in /Users/marianol/Code/stack-overflow/enums.php:8 
Stack trace: 
#0 /Users/marianol/Code/stack-overflow/enums.php(23): WeekDay->__construct('Saturday') 
#1 {main} 
    thrown in /Users/marianol/Code/stack-overflow/enums.php on line 8 

Кстати, перечислений не используются в основном для аргументов функции типа, намекая на. Например, базы данных используют поля enum для оптимизации эффективности хранения (поскольку для перечислений требуется гораздо меньше места для хранения, чем для строк), и если ваш язык программирования не предлагает тип данных enum, вы должны быть очень осторожны при извлечении, изменении и сохранении к типу данных перечисления обратно в вашу базу данных.

+0

хороший пункт о колонке базы данных. Я все еще придерживаюсь своего мнения, сколько строк используется в качестве аргументов функции при работе в качестве разработчика программного обеспечения? сколько?? и это всегда очень четко определенный набор строк, это не «хорошо делать то, что вы хотите». И нет способа выразить, что этот набор строк доступен. Очень жаль, что нужно обратиться за документами для каждой отдельной функции. – Toskan

+0

@ Тоскан: И это хороший момент. Наличие компилятора (или интерпретатора) поможет вам найти большинство проблем - это именно то, что вы получаете с сильно типизированными языками. – mlg

+0

ну да, правда, но статически типизированные языки тоже имеют недостатки. Это было бы достаточно хорошо, если бы тип hinting работал правильно в php, и были бы перечисления. Похоже, много спрашивать, но это действительно так. Интересно, как работает хинтинг типа python 3.x, поскольку он, как представляется, имеет перечисления с 3.4. Не имея таких вещей, просто программирование мыши. – Toskan

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