如何在php函数中使用类中的常量作为参数定义?
我有一门课:如何在php函数中使用类中的常量作为参数定义?,php,oop,function,Php,Oop,Function,我有一门课: class FetchMode { const FetchAll = 0; const FetchOne = 1; const FetchRow = 2;} 和一个函数: function getRecordSet(FetchMode $FetchMode){ some switch cases } getRecordSet(FetchMode::FetchOne); 我想使用$FetchMode作为切换案例标准,但收到一个错误: 可捕获的致命错误:传递给getRec
class FetchMode
{
const FetchAll = 0;
const FetchOne = 1;
const FetchRow = 2;}
和一个函数:
function getRecordSet(FetchMode $FetchMode){ some switch cases }
getRecordSet(FetchMode::FetchOne);
我想使用$FetchMode作为切换案例标准,但收到一个错误:
可捕获的致命错误:传递给getRecordSet()的参数必须是给定整数的FetchMode实例
这就是我调用函数的方式:
function getRecordSet(FetchMode $FetchMode){ some switch cases }
getRecordSet(FetchMode::FetchOne);
我想提供一个调用函数的可能选择列表。
在php中可能吗?我不知道你说的是什么意思 希望提供调用函数时可能的选择列表。在php中可能吗 但是对于错误部分:假设您有一个var,例如
$foo
。当您执行echo$foo时,您不会得到var的名称,而是它的值。这是因为var有一个名称并指向一个值。对var的每次访问基本上都返回它所指向的值。常数也一样;您将常量名称放在其中,但基本上是指向存储的值。这意味着getRecordSet(FetchMode::FetchOne)
和getRecordSet(1)代码>是相同的
因此,getRecordSet(FetchMode$FetchMode)
raises必须是FetchMode的一个实例,因为FetchMode::FetchOne
指向一个整数
要解决此问题,需要使用getRecordSet(int$FetchMode)
您希望PHP会出现FetchMode
的实例(就像错误消息中所说的那样),但是FetchMode::FETCH*
会传递常量值。您必须使用某种类型的枚举实例(我们在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:
}
}
这将增加类的可用性,并强制更改该类和FetchMode
每当需要添加其他FetchMode时,您可以执行以下操作:
public function getRecordSet(FetchMode $fetchModeStrategy)
{
return $fetchModeStrategy->fetch();
}
然后有一个
并为每个支持的FetchMode添加具体的FetchMode
类
class FetchOne implements FetchMode
{
public function fetch()
{
// code to fetchOne
}
}
class FetchAll …
class FetchRow …
这样,您就不必再次使用getRecordSet
方法来接触类,因为它适用于实现FetchMode
interface的任何类。因此,每当您有新的FetchModes时,只需添加一个新类,从长远来看,该类更易于维护。FetchMode::FetchOne解析为1,因此您实际上将1传递给函数,而不是FetchMode类型的对象。我不知道您想要实现什么,但请记住,您必须将FetchMode类型的对象传递给函数,因此您需要某种$fm=new FetchMode()代码>我不想强迫其他开发人员知道哪种选择具有哪种价值。这就是为什么我尝试使用functionname(FetchMode::FetchOne)而不是他们不必知道的functionname(1)。您仍然可以使用FetchMode::FetchOne
,但是您的函数声明仍然将int
而不是FetchMode
作为参数(因为您的参数指向int
而不是FetchMode
的实例)除非你像Gordon在回答中解释的那样使用某种策略模式。8年后,我仍然觉得你的回答是我读过的最好的方法之一。谢谢!