object :: method()必须与objectAbstract :: method()的兼容 - 传递参数=值?

时间:2013-03-08 18:55:04

标签: php oop

我是PHP OOP的新手,我收到了一个错误。

objectForm :: addMessage()必须与第xx行中的/www/form/Form.php中的objectAbstractForm :: addMessage()兼容

我已经看过几次这样的方法参数就像$ var1,$ var2 = false(或null),无论出于什么原因,我得到“必须与X :: Y()的那些相符”

public function addMessage($message, $messageType = 'info')
{
    if (!in_array($message, $this->_messages)) {
        if ('info' == $messageType) {
            $this->_messages[] = $message;
        } else {
            $this->_errorMessages[] = $message;
        }
    }
}

由于我在OOP上相当新,我无法找到更好的方法。

编辑:例如,在父级中

abstract class objectAbstractForm {

abstract protected function addMessage($message, $messageType);

}

有什么更好的方法可以做到这一点?我使用的是PHP 5.2.17

2 个答案:

答案 0 :(得分:2)

问题是你在子类中使第二个参数可选,但在父类中是必需的。如果你想要一个可选参数,你也需要在父类中使它成为可选参数。

答案 1 :(得分:1)

我想你的类正在扩展另一个(从它在objectForm中扩展/www/form/Form.php的错误消息),objectAbstractForm::addMessage()的方法签名(此处发布的方法)必须相同为objectForm::addMessage()

例如:

class A {
    public function test($a, $b, $c=null) {
        // code
    }
}


class B extends A {
    public function test($a, $b, $c=null) {
        // code
    }
}


class C extends A {
    public function test($a, $b=null) {
        // code
    }
}

C将生成您的错误,方法C::test()的签名与方法A::test()中的签名不同,而B::test()将被接受,因为它签名与A::test()相同。

我非常乐意让我的回答更具体针对您的问题,但您需要发布objectForm::addMessage()的方法签名以及objectAbstractForm和{{1的类签名}}

编辑:我反过来猜测你的类,但原理是一样的,你不能在PHP 5.2中找到不匹配的参数。您需要根据自己的喜好编辑签名。

或者,您可以升级到PHP 5.3或更高版本,这不会让您感到唠叨。

HTH

P.S。:当我说“方法签名”时,我不确定我是否使用了正确的术语,但如果我错了,请随时纠正我:)