0

私はPHP OOPにかなり慣れていないので、エラーが発生しています。

objectForm::addMessage() は、/www/form/Form.php 行 xx の 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

問題は、子クラスでは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()とクラス署名の両方objectAbstractFormを投稿する必要があります。Form

編集:私はあなたのクラスを逆に推測しましたが、原則は同じです。PHP 5.2 ではパラメーターの不一致はあり得ません。必要に応じて署名を編集する必要があります。

または、PHP 5.3 以降にアップグレードすることもできます。

HTH

PS: 「メソッド シグネチャ」と言うときに正しい用語を使用しているかどうかはわかりませんが、間違っている場合は遠慮なく訂正してください :)

于 2013-03-08T19:04:16.083 に答える