厳密な標準:childClass :: customMethod()の宣言は、parentClass :: customMethod()の宣言と互換性がある必要があります
PHPでこのエラーの考えられる原因は何ですか?互換性があるとはどういう意味ですか?
use Closure;
、クラス型の先頭に追加されなかったことでした(型ヒントがだったためClosure
)。だから...そのような依存関係がないかどうかを確認してください。
厳密な標準:childClass :: customMethod()の宣言は、parentClass :: customMethod()の宣言と互換性がある必要があります
PHPでこのエラーの考えられる原因は何ですか?互換性があるとはどういう意味ですか?
use Closure;
、クラス型の先頭に追加されなかったことでした(型ヒントがだったためClosure
)。だから...そのような依存関係がないかどうかを確認してください。
回答:
childClass::customMethod()
とは異なる引数、またはとは異なるアクセスレベル(public / private / protected)がありparentClass::customMethod()
ます。
parentClass::customMethod($thing = false)
そしてchildClass::customMethod($thing)
子供の方法は、最初の引数のデフォルト値が定義されていないため、エラーが表示されます。
&
引数にアンパサンド()がないと、このエラーも発生する可能性があります。
このメッセージは、実行時に失敗する可能性がある特定の可能なメソッド呼び出しがあることを意味します。あなたが持っていると仮定します
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) {;}}
それは必要以上に制限的だと思われ、私は内部のせいだと思います。
可視性の違いは別のエラーを引き起こしますが、基本的な理由は同じです。親メソッドよりも目立たないメソッドはありません。
エラーをオフにすることなく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();
// ...
}
}
func_get_args()
で、すなわち、B
、public function foo($a = null, $b = null, $c = null)
これは約束したことで契約を壊さないよう、A
。
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」という新しいメソッドを作成しました。実際、どちらも同じように動作し、クラスを返すだけですが、前に説明したように、名前空間は異なります。
これが誰かを助けることを願っています。
function customMethod( ... )
各関数のヘッダー(最初の行のみ)を投稿できれば、具体的な問題を知ることができます