Как использовать константу из класса в качестве определения аргумента в функции PHP? - PullRequest
7 голосов
/ 02 марта 2012

У меня есть класс:

class FetchMode 
{
 const FetchAll = 0;
 const FetchOne = 1;
 const FetchRow = 2;}

и функция:

function getRecordSet(FetchMode $FetchMode){ some switch cases }

Я хотел бы использовать $ FetchMode в качестве критерия переключения, но получил ошибку: Исправляемая фатальная ошибка: аргумент, переданный getRecordSet (), должен быть экземпляром FetchMode, целое число равно

вот как я вызываю функцию:

getRecordSet(FetchMode::FetchOne);

Я хотел бы предложить список возможных вариантов вызова функции. Возможно ли это в php?

Ответы [ 2 ]

10 голосов
/ 02 марта 2012

Вы намекнули PHP на ожидание экземпляра FetchMode (как сказано в сообщении об ошибке), но FetchMode::FETCH* передает константу значение . Вам нужно будет использовать какой-то экземпляр Enum (которого у нас нет в PHP. (Ну, ладно, есть SplEnum, но кто его использует?)) Или изменить сигнатуру метода, чтобы исключить подсказку.

Однако вместо Switch / Case вы могли бы решить эту проблему проще с помощью полиморфизма и паттерна стратегии , например. вместо того, чтобы делать что-то вроде

public function getRecordSet($mode)
{
    switch ($mode) {
        case FetchMode::ALL:
            // code to do a fetchAll
            break;
        case FetchMode::ONE:
            // code to do a fetchOne
            break;
        default:
    }
}

, который увеличит Сложность Cylcomatic вашего класса и вынудит к этому классу изменения и FetchMode всякий раз, когда вам потребуется добавить дополнительные FetchModes, вы можете сделать:

public function getRecordSet(FetchMode $fetchModeStrategy)
{
    return $fetchModeStrategy->fetch();
}

и затем интерфейс до для защиты варианта

interface FetchMode
{
    public function fetch();
}

и добавьте конкретные FetchMode классы для каждого поддерживаемого FetchMode

class FetchOne implements FetchMode
{
    public function fetch()
    {
        // code to fetchOne
    }
}
class FetchAll …
class FetchRow …

Таким образом, вам никогда не придется снова прикасаться к классу с помощью этого метода getRecordSet, потому что он будет работать для любого класса, реализующего этот FetchMode интерфейс. Таким образом, всякий раз, когда у вас появляются новые FetchModes, вы просто добавляете новый класс, который в долгосрочной перспективе гораздо удобнее обслуживать.

0 голосов
/ 02 марта 2012

Я не знаю, что вы подразумеваете под

, и хотел бы предложить список возможных вариантов вызова функции.Возможно ли это в php?

, но для части ошибки: представьте, что у вас есть переменная, например, $foo.Когда вы делаете echo $foo, вы получаете не имя переменной, а ее значение.Это потому, что переменная имеет имя и указывает на значение.Каждый доступ к var в основном возвращает значение, на которое он указывает.То же самое с константами;Вы помещаете туда постоянное имя, но в основном вы указываете на свое сохраненное значение.Это означает, что getRecordSet(FetchMode::FetchOne); и getRecordSet(1); одинаковы.

Итак, getRecordSet(FetchMode $FetchMode) повышает must be an instance of FetchMode, поскольку FetchMode::FetchOne указывает на целое число.

Чтобы это исправить, вам нужноиспользуйте getRecordSet(int $FetchMode).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...