我有一节课:
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,您只需添加一个新类,从长远来看,它更易于维护.