0

我对 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

4

2 回答 2

2

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

于 2013-03-08T19:14:00.170 回答
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()类签名objectAbstractFormForm

编辑:我对你的类有相反的猜测,但原理是一样的,你不能在 PHP 5.2 中出现参数不匹配的情况。您将需要编辑您喜欢的签名。

或者,您可以升级到 PHP 5.3 或更高版本,这不会困扰您。

高温高压

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

于 2013-03-08T19:04:16.083 回答