115
厳格な基準:childClass :: customMethod()の宣言は、parentClass :: customMethod()の宣言と互換性がある必要があります

PHPでこのエラーが発生する原因として考えられるものは何ですか?互換性があるとはどういう意味かについての情報はどこにありますか?

4

5 に答える 5

130

childClass::customMethod()とは異なる引数、または異なるアクセスレベル(パブリック/プライベート/保護)がありparentClass::customMethod()ます。

于 2010-06-25T03:40:09.173 に答える
38

このメッセージは、実行時に失敗する可能性のある特定のメソッド呼び出しがあることを意味します。あなたが持っているとしましょう

class A { public function foo($a = 1) {;}}
class B extends A { public function foo($a) {;}}
function bar(A $a) {$a->foo();}

コンパイラーは、パラメーターを必要としないA :: foo()の要件に対して$ a-> foo()の呼び出しのみをチェックします。ただし、$ aはパラメータを必要とするクラスBのオブジェクトである可能性があるため、実行時に呼び出しは失敗します。

ただし、これは失敗することはなく、エラーをトリガーしません

class A { public function foo($a) {;}}
class B extends A { public function foo($a = 1) {;}}
function bar(A $a) {$a->foo();}

したがって、親メソッドよりも多くの必須パラメーターを持つメソッドはありません。

タイプヒントが一致しない場合にも同じメッセージが生成されますが、この場合、PHPはさらに制限が厳しくなります。これによりエラーが発生します:

class A { public function foo(StdClass $a) {;}}
class B extends A { public function foo($a) {;}}

これがそうであるように:

class A { public function foo($a) {;}}
class B extends A { public function foo(StdClass $a) {;}}

それは必要以上に制限されているようで、内部的なものだと思います。

可視性の違いにより、異なるエラーが発生しますが、基本的な理由は同じです。親メソッドよりも目立たないメソッドはありません。

于 2012-02-11T19:01:12.587 に答える
24

エラーをオフにせずにOOPフォームを保持したい場合は、次のこともできます。

class A
{
    public function foo() {
        ;
    }
}
class B extends A
{
    /*instead of : 
    public function foo($a, $b, $c) {*/
    public function foo() {
        list($a, $b, $c) = func_get_args();
        // ...

    }
}
于 2014-12-06T07:47:43.657 に答える
2

次のように関数パラメーターをタイプヒントする場合は、インターフェイスのコンテキストでこのエラーを拡張するだけです。

インターフェイスA

use Bar;

interface A
{
    public function foo(Bar $b);
}

クラスB

class B implements A
{
    public function foo(Bar $b);
}

実装クラス(クラスB)にステートメントを含めるのを忘れた場合はuse、メソッドのパラメーターが同じであっても、このエラーが発生します。

于 2017-03-21T09:41:58.833 に答える
0

GitHubから既存のクラスを拡張しようとしたときに、この問題に直面しました。私は自分自身を説明しようとします。最初にあるべき姿でクラスを書き、次に今のようにクラスを書きます。

でも私は

namespace mycompany\CutreApi;

use mycompany\CutreApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function whatever(): ClassOfVendor
   {
        return new ClassOfVendor();
   }
}

私がついにやったこと

namespace mycompany\CutreApi;

use \vendor\AwesomeApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function whatever(): ClassOfVendor
   {
        return new \mycompany\CutreApi\ClassOfVendor();
   }
}

したがって、名前空間化されたクラスを返すメソッドを使用していて、同じクラスを他の名前空間で返そうとした場合にも、このエラーが発生するようです。幸い、私はこの解決策を見つけましたが、php 7.2のこの機能の利点を完全には理解していません。私にとっては、入力パラメーターの再定義や、方法。

以前のアプローチの欠点の1つは、IDEが\ mycompany \ CutreApi \ ClassOfVendor()に実装された新しいメソッドを認識できなかったことです。したがって、今のところ、この実装を使用します。

現在完了

namespace mycompany\CutreApi;

use mycompany\CutreApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function getWhatever(): ClassOfVendor
   {
        return new ClassOfVendor();
   }
}

そこで、「whatever」メソッドを使用する代わりに、「getWhatever」という新しいメソッドを作成しました。実際、どちらも同じことをしていて、クラスを返すだけですが、前に説明したように異なる名前空間を使用しています。

これが誰かを助けることができることを願っています。

于 2020-04-28T08:07:24.727 に答える