PHP Strict standards:Declaration of … should be compatible with that of…

2503 ワード

今日は元の古いPHPコードをPaaSにインポートし、多くのStrict standards:Declaration of...should be compatible with that of...というエラーが発生しました.文字通り関数が一致していないという意味のようですが、エラーの関数を見ると、サブクラスが書き換えたベースクラス関数です.インターネットで検索してみると、多くの投稿がほぼ写したように、php 5のためだということがわかりました.3バージョン以降、継承クラスは親の後に定義する必要があります.親定義が前で、継承クラスが後であれば、このエラーは発生しません.特にhttp://bugs.php.net/bug.php?id=46851には、正反対の例が示されています.
1
2
3
4
5
6
7
8
9 <?php // this code does trigger a strict message error_reporting ( E_ALL | E_STRICT );
  class cc extends c { function test() { return null; } } class c { function test( $a ) { return 1; } }
  $cc = new cc(); ?>
1
2
3
4
5
6
7
8
9 <?php // this code does NOT trigger a strict message error_reporting ( E_ALL | E_STRICT );
  class c { function test( $a ) { return 1; } } class cc extends c { function test() { return null; } }
  $cc = new cc(); ?>
そして、エラーについて議論したのは、Autoload()はクラスを自動的にincludeし、ベースクラスの定義が後になり、サブクラスの定義が前になります.
私は自分のコードを見て、確かにautoloadも使っていますが、いくつかのベースクラスを明示的に先に導入しているので、このような状況はありません.そして、上記の正逆の例を試してみると、E_が現れます.STRICTの警告.
本当の原因:
実際には、サブクラスの書き換え方法のパラメータがベースクラスと異なる場合は、パラメータにデフォルト値を与え、コンパイラがパラメータを空にすることができると考え、書き換え方法がベースクラスの方法の関数署名と同じであることを維持すればよい.
よくJAVAを使う人はきっと知っていて、JAVAあるいはC++の中で、書き換え方法の関数の署名は元来基類の関数と一致するべきで、私はこれも自然の法則に合致すると思って、overrideはもともとカバーする意味なので、カバーした以上、元の関数と一致するべきで、さもなくばどのように“蓋”の居住~しかも方法の書き換えは多く虚関数を書き換えるあるいはもっとはっきりしているのはインタフェースの関数を書き換えることに用いて、もし書き換える時関数の署名がすべて一致しないならば、またインタフェースは何をします.の
だからPHPの新しいバージョンでは、このE_を定義すると思います.STRICTの警告エラーは役に立つので、プログラマー自身の書き方が正しいかどうかを注意しましょう.
最後に、上のコピーされた投稿を軽蔑します.ある言語がベースクラスとサブクラスの定義の順序さえ乱すことができない場合は、このコンパイラが非常に問題があることを示しています.明らかにバグです.の