7

PHPの組み込みエラーチェックによって警告されるエラーがコードベースにないことを確認することに実際に興味がありますが、E_STRICTが何を強制するかを正確に確認したいと思います。ひいては、PHPの「厳格な基準」とは何ですか?調べましたが、包括的なリストが見つかりませんでした。

私が経験から直接知っているいくつかの厳格な基準:

  • 非静的メソッドを静的に呼び出さないように警告する
  • 互換性のないサブクラス関数のシグネチャに対して警告する
  • 参照による値の割り当てに対して警告する

E_STRICTについて私が知っているのは、互換性を損なう可能性のあるコードに対して警告することだけですが、それが具体的に何を意味するのかはわかりません。

これに関する情報のための良いリソースはありますか?

4

1 に答える 1

12

E_STRICTと「厳格な基準」は同じものです。(そして、それらはPHP 7で削除されました。)

現在、ドキュメントには特定のE_STRICT警告のリストはありませんが、PHPソースを検索することでかなり簡単に警告を作成できます。

以下のリスト(PHP 5.6の時点で正確であると私は信じています)は、次の方法でUnixシステム上に作成されました。

  1. PHPGitリポジトリのクローンを作成します。

    git clone https://github.com/php/php-src
    
  2. バージョン5.6.0のチェックアウト:

    cd php-src
    git checkout PHP-5.6.0
    
  3. 以下を含むすべてのCファイル(拡張子が1つ)を.h検索します。.cE_STRICT

    grep --include=*.[ch] -rl . -e E_STRICT
    
  4. (21)一致した各ファイルを手動で調べて、E_STRICT警告を発するコードを見つけ、警告が発せられる状況を推測しようとします(私は、Cプログラマーではありませんが、これを適切に推測するのはそれほど難しくありません。特に、コード内に人間が読めるエラーメッセージが含まれている場合は、インタラクティブなPHPシェルでそれらをテストして、私が正しいことを確認します。

E_STRICT上記の方法論はやや粗雑であり、警告が発せられるすべての場所の横にあるソースコードにある仮定に依存していることを考えると、私がいくつかのものを見逃した可能性がありますE_STRICT-しかし、これは少なくとも包括的なリスト。

E_STRICT警告を引き起こすPHPの事柄

  1. mktime()引数なしで呼び出す

    php> mktime();
    PHPの厳格な標準:mktime():time()関数を使用する必要があります
    代わりに、1行目のphpシェルコードで
  2. リソースを配列インデックスとして使用する

    php> $ file_pointer = fopen('/ dev / null'、'r'); 
    php> $ array = [3,4,5,6]; 
    php> $ array [$ file_pointer];
    PHPの厳格な標準:オフセットとして使用されるリソースID#2、整数へのキャスト(2)
    1行目のphpシェルコード
  3. UTF-8以外のマルチバイトエンコーディングをに渡すhtmlentities

    php> htmlentities('qwertyuiop'、0、'BIG5');
    PHPの厳格な標準:htmlentities():基本的なエンティティの置換のみが
    UTF-8以外のマルチバイトエンコーディングでサポートされています。機能は
    1行目のphpシェルコードのhtmlspecialcharsに相当します
  4. 抽象 静的メソッドの宣言

    php>抽象クラスFoo{静的抽象関数bar(); }
    PHPの厳格な標準:静的関数Foo :: bar()はで抽象化されるべきではありません
    1行目のphpシェルコード
  5. __constructメソッドと、クラスにちなんで名付けられた古いスタイルのコンストラクター関数の両方を使用してクラスを宣言する

    php> class MyClass { 
    php {     function MyClass(){} 
    php {     function __construct(){} 
    php { }
    PHPの厳格な標準:クラス用に定義済みのコンストラクターを再定義する
    3行目のphpシェルコードのMyClass
  6. 準備する次の結果がないMysqli接続オブジェクトの呼び出しmysqli_next_resultまたはmysqli::next_result

    php> $ conn = mysqli_connect( '127.0.0.1'、'root'); 
    php> mysqli_multi_query($ conn、 "SELECT'first'; SELECT'second';"); 
    php> echo mysqli_use_result($ conn)-> fetch_row()[0];
    最初
    php> mysqli_next_result($ conn); 
    php> echo mysqli_use_result($ conn)-> fetch_row()[0];
    2番目
    php> mysqli_next_result($ conn);
    PHPの厳格な標準:mysqli_next_result():次の結果セットはありません。
    mysqli_more_results()/ mysqli :: more_results()を呼び出して、
    1行目のphpシェルコードでこの関数/メソッドを呼び出す
  7. サブクラスのメソッドをオーバーライドして、親の同じメソッドに対して異なる数の引数を取る

    php>クラスA{publicfunction foo($ x){}} 
    php>クラスBextends A {public function foo(){}}
    PHPの厳格な標準:B :: foo()の宣言はと互換性がある必要があります
    1行目のphpシェルコードのA::foo($ x)
    php>クラスCはAを拡張します{publicfunctionfoo($ x、$ y){}}
    PHPの厳格な標準:C :: foo()の宣言はと互換性がある必要があります
    1行目のphpシェルコードのA::foo($ x)
  8. トレイトとそれを使用するクラスで同じプロパティを互換性を持って宣言します。これは実際にうまく文書化されています:

    トレイトがプロパティを定義している場合、クラスは同じ名前のプロパティを定義できません。そうでない場合、エラーが発行されます。これはE_STRICT、クラス定義に互換性がある場合(同じ可視性と初期値)、またはそれ以外の場合は致命的なエラーです。

    例12競合の解決

    <?php
    trait PropertiesTrait {
        public $same = true;
        public $different = false;
    }
    
    class PropertiesExample {
        use PropertiesTrait;
        public $same = true; // Strict Standards
        public $different = true; // Fatal error
    }
    ?>
    

    厳密モードの警告の例:

    php>トレイトPropertiesTrait{ 
    php{     public $ same = true; 
    php { } 
    php> class PropertiesExample { 
    php {     use PropertiesTrait; 
    php {     public $ same = true; 
    php { }
    PHPの厳格な標準:PropertiesExampleとPropertiesTraitは、
    PropertiesExampleの構成で同じプロパティ($ same)。これはかもしれません
    互換性がないため、保守性を向上させるためにアクセサの使用を検討してください
    代わりに特性のメソッド。クラスは4行目のphpシェルコードで構成されました
  9. 非静的メソッドを静的に呼び出す

    php> class Foo {function bar(){}} 
    php> Foo :: bar();
    PHPの厳格な標準:非静的メソッドFoo :: bar()は呼び出さないでください
    1行目のphpシェルコードで静的に
  10. 非静的に静的プロパティを参照する

    php> class Cow {static public $ noise ='moo'; } 
    php> $ cow = new Cow; 
    php> $ cow-> noise = "MOOOOO";
    PHPの厳格な基準:静的プロパティCow ::$noiseへの非静的としてのアクセス
    1行目のphpシェルコード
  11. 関数呼び出しの結果を参照によって直接渡す。

    php> function foo(){return 1; } 
    php>関数バー(&$ some_arg){} 
    php> bar(foo());
    PHPの厳格な標準:phpでは変数のみを参照で渡す必要があります
    1行目のシェルコード
    php> $ var =&foo();
    PHPの厳格な基準:変数のみを参照により割り当てる必要があります
    1行目のphpシェルコード

    リテラルや定数など、他の非変数を参照で渡すことは、致命的なエラーではなく、致命的なエラーであることに注意してください。E_STRICT

于 2014-09-13T18:24:21.550 に答える