如何在php函数中使用常量作为参数定义?

dll*_*ell 7 php oop function

我有一节课:

class FetchMode 
{
 const FetchAll = 0;
 const FetchOne = 1;
 const FetchRow = 2;}
Run Code Online (Sandbox Code Playgroud)

和功能:

function getRecordSet(FetchMode $FetchMode){ some switch cases }
Run Code Online (Sandbox Code Playgroud)

我想使用$ FetchMode作为切换案例标准但收到错误: 可捕获致命错误:传递给getRecordSet()的参数必须是FetchMode的实例,给定整数

这就是我调用函数的方式:

getRecordSet(FetchMode::FetchOne);
Run Code Online (Sandbox Code Playgroud)

我想提供一个调用函数的可能选择列表.在PHP中有可能吗?

Gor*_*don 10

您已经暗示 PHP期望一个实例FetchMode(就像它在错误消息中所说的那样),但是FetchMode::FETCH*传递常量值.你必须使用某种类型的Enum实例(我们在PHP中没有这些实例.(哦,有SplEnum但是谁使用它?))或更改方法签名以排除typehint.

但是,您可以通过多态性策略模式更轻松地解决这个问题,而不是做出像

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:
    }
}
Run Code Online (Sandbox Code Playgroud)

这将增加Cylcomatic复杂的类和力量改变这个类和FetchMode当您需要添加额外的FetchModes,你可以这样做:

public function getRecordSet(FetchMode $fetchModeStrategy)
{
    return $fetchModeStrategy->fetch();
}
Run Code Online (Sandbox Code Playgroud)

然后有一个界面保护变化

interface FetchMode
{
    public function fetch();
}
Run Code Online (Sandbox Code Playgroud)

FetchMode为每个支持的FetchMode 添加具体类

class FetchOne implements FetchMode
{
    public function fetch()
    {
        // code to fetchOne
    }
}
class FetchAll …
class FetchRow …
Run Code Online (Sandbox Code Playgroud)

这样,您将永远不必getRecordSet再次使用该方法触及该类,因为它适用于实现该FetchMode接口的任何类.因此,无论何时有新的FetchModes,您只需添加一个新类,从长远来看,它更易于维护.