【问题标题】:method in the child class redefined different from the parent class gives error (strict standards)重新定义与父类不同的子类中的方法给出错误(严格标准)
【发布时间】:2011-08-28 07:39:14
【问题描述】:

我收到此错误:

PayPal::raiseError() 声明 应该与 PEAR::raiseError()

它们分别是 PEAR::raiseError() 和 PayPal::raiseError():

function &raiseError($message = null,
                     $code = null,
                     $mode = null,
                     $options = null,
                     $userinfo = null,
                     $error_class = null,
                     $skipmsg = false)
{


class PayPal extends PEAR
{
    function raiseError($message, $code = null)
    {
        return parent::raiseError($message, $code, null, null, null, 'PayPal_Error');
    }

有什么方法可以在不修改定义的情况下使其工作?

我阅读了here 关于加载类的顺序。会不会是这个问题?

【问题讨论】:

    标签: php inheritance methods


    【解决方案1】:

    这个问题与加载类的顺序无关。由于PayPal 扩展了PEAR,任何将PEAR 对象作为参数的函数实际上都可能被赋予PayPal 对象。由于PEAR 方法raiseError() 最多允许七个参数,因此PayPal 方法也应该至少允许最多七个参数。

    最好的解决方案是在PayPal 中重构raiseError()

    function raiseError($message = null,
                        $code = null,
                        $mode = null,
                        $options = null,
                        $userinfo = null,
                        $error_class = null,
                        $skipmsg = false)
    {
        return parent::raiseError($message, $code, $mode, $options,
                                  $userinfo, 'PayPal_Error', $skipmsg);
    }
    

    【讨论】:

    • 谢谢,它有效!,您忘记的唯一细节是方法名称前的“&”。没有那个错误是一样的。
    【解决方案2】:

    子类方法的签名(参数)需要与父方法相同。这是因为 PHP 不允许重载具有不同参数计数或类型的函数。

    您总是可以将您的 raiseError 方法重命名为不同的名称,例如 raiseErrorWrapper 来回避这个问题。

    【讨论】:

      猜你喜欢
      • 2019-08-11
      • 2019-07-22
      • 2011-10-23
      • 2015-07-05
      • 1970-01-01
      • 2012-12-09
      • 2023-03-31
      • 2011-10-07
      • 2022-07-20
      相关资源
      最近更新 更多