我有一个类:
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 Polymorphism和Strategy 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();
}
然后有一个interface到protect 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,就只需添加一个新类,从长远来看,它将更易于维护。