方法必须与接口方法兼容

时间:2015-08-06 16:50:50

标签: php

我有一个定义方法charge()的接口,第一个参数是必需的,第二个参数是可选的,我的布局看起来像这样:

interface Process{

    public function charge($customerProfileId, $paymentProfileId = null);

    // Other items

}

abstract class CardProcessor implements Process{

    // Some methods & properties are here

}

class Authorize extends CardProcessor{

    public function charge($customerProfileId, $paymentProfileId){
        // Process the card on profile
    }

}

当我加载文件时(即使我没有执行charge()),我收到以下错误:

  

PHP致命错误:声明src \ processors \ CardProcessors \ Authorize :: charge()必须与/ home / processor / src /中的src \ interfaces \ Process :: charge($ customerProfileId,$ paymentProfileId = NULL)兼容第19行"

处理器/ CardProcessors / Authorize.php

这是什么原因?看起来对我来说......

2 个答案:

答案 0 :(得分:2)

您的子类中的charge方法的签名仍然必须根据接口中的原始签名进行匹配。在我看来,您的层次结构仍然需要匹配的签名。

来自:PHP

  

此外,方法的签名必须匹配,即类型提示和所需参数的数量必须相同。例如,如果子类定义了一个可选参数,而抽象方法的签名没有,则签名中不存在冲突。

此外,来自PHP Object Interfaces

  

实现接口的类必须使用与接口中定义的完全相同的方法签名。不这样做会导致致命的错误。

答案 1 :(得分:2)

interface Process
{    
    public function charge($customerProfileId, $paymentProfileId);   
    // Other items
}

abstract class CardProcessor implements Process 
{   
    // Some methods & properties are here
    public abstract function charge($customerProfileId, $paymentProfileId);
}

class Authorize extends CardProcessor 
{    
    public function charge($customerProfileId, $paymentProfileId = null)
    {
        // Process the card on profile
    }    
}
  • 按照@Dev Mode
  • 的建议,为抽象类CardProcessor添加了方法签名
  • 实施 超出接口(var = null)并将其放在具体类中。