Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php函数中使用类中的常量作为参数定义?_Php_Oop_Function - Fatal编程技术网

如何在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年后,我仍然觉得你的回答是我读过的最好的方法之一。谢谢!