我有一个类:

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中吗?

最佳答案

您已经将hinted PHP期望为FetchMode的实例(就像错误消息中说的那样),但是FetchMode::FETCH*传递了常量值。您必须使用某种Enum实例(我们在PHP中本身没有)(哦,有SplEnum,但谁使用它?)或更改方法签名以排除typehint。

但是,您可以使用solve this more easily via PolymorphismStrategy pattern代替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:
    }
}

每当需要添加其他FetchMode时,这都会增加类的Cylcomatic Complexity并强制更改该类和FetchMode,您可以执行以下操作:
public function getRecordSet(FetchMode $fetchModeStrategy)
{
    return $fetchModeStrategy->fetch();
}

然后有一个interfaceprotect the variation
interface FetchMode
{
    public function fetch();
}

并为每个受支持的FetchMode添加具体的FetchMode
class FetchOne implements FetchMode
{
    public function fetch()
    {
        // code to fetchOne
    }
}
class FetchAll …
class FetchRow …

这样,您将不再需要再次使用getRecordSet方法来触摸该类,因为它适用于实现FetchMode接口(interface)的任何类。因此,只要有了新的FetchModes,就只需添加一个新类,从长远来看,它将更易于维护。

10-04 12:46