E_STRICT
と「厳格な基準」は同じものです。(そして、それらはPHP 7で削除されました。)
現在、ドキュメントには特定のE_STRICT
警告のリストはありませんが、PHPソースを検索することでかなり簡単に警告を作成できます。
以下のリスト(PHP 5.6の時点で正確であると私は信じています)は、次の方法でUnixシステム上に作成されました。
PHPGitリポジトリのクローンを作成します。
git clone https://github.com/php/php-src
バージョン5.6.0のチェックアウト:
cd php-src
git checkout PHP-5.6.0
以下を含むすべてのCファイル(拡張子が1つ)を.h
検索します。.c
E_STRICT
grep --include=*.[ch] -rl . -e E_STRICT
(21)一致した各ファイルを手動で調べて、E_STRICT
警告を発するコードを見つけ、警告が発せられる状況を推測しようとします(私は、Cプログラマーではありませんが、これを適切に推測するのはそれほど難しくありません。特に、コード内に人間が読めるエラーメッセージが含まれている場合は、インタラクティブなPHPシェルでそれらをテストして、私が正しいことを確認します。
E_STRICT
上記の方法論はやや粗雑であり、警告が発せられるすべての場所の横にあるソースコードにある仮定に依存していることを考えると、私がいくつかのものを見逃した可能性がありますE_STRICT
-しかし、これは少なくとも包括的なリスト。
E_STRICT警告を引き起こすPHPの事柄
mktime()
引数なしで呼び出す
php> mktime();
PHPの厳格な標準:mktime():time()関数を使用する必要があります
代わりに、1行目のphpシェルコードで
リソースを配列インデックスとして使用する
php> $ file_pointer = fopen('/ dev / null'、'r');
php> $ array = [3,4,5,6];
php> $ array [$ file_pointer];
PHPの厳格な標準:オフセットとして使用されるリソースID#2、整数へのキャスト(2)
1行目のphpシェルコード
UTF-8以外のマルチバイトエンコーディングをに渡すhtmlentities
php> htmlentities('qwertyuiop'、0、'BIG5');
PHPの厳格な標準:htmlentities():基本的なエンティティの置換のみが
UTF-8以外のマルチバイトエンコーディングでサポートされています。機能は
1行目のphpシェルコードのhtmlspecialcharsに相当します
抽象 静的メソッドの宣言
php>抽象クラスFoo{静的抽象関数bar(); }
PHPの厳格な標準:静的関数Foo :: bar()はで抽象化されるべきではありません
1行目のphpシェルコード
__construct
メソッドと、クラスにちなんで名付けられた古いスタイルのコンストラクター関数の両方を使用してクラスを宣言する
php> class MyClass {
php { function MyClass(){}
php { function __construct(){}
php { }
PHPの厳格な標準:クラス用に定義済みのコンストラクターを再定義する
3行目のphpシェルコードのMyClass
準備する次の結果がない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シェルコードでこの関数/メソッドを呼び出す
サブクラスのメソッドをオーバーライドして、親の同じメソッドに対して異なる数の引数を取る
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)
トレイトとそれを使用するクラスで同じプロパティを互換性を持って宣言します。これは実際にうまく文書化されています:
トレイトがプロパティを定義している場合、クラスは同じ名前のプロパティを定義できません。そうでない場合、エラーが発行されます。これは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シェルコードで構成されました
非静的メソッドを静的に呼び出す
php> class Foo {function bar(){}}
php> Foo :: bar();
PHPの厳格な標準:非静的メソッドFoo :: bar()は呼び出さないでください
1行目のphpシェルコードで静的に
非静的に静的プロパティを参照する
php> class Cow {static public $ noise ='moo'; }
php> $ cow = new Cow;
php> $ cow-> noise = "MOOOOO";
PHPの厳格な基準:静的プロパティCow ::$noiseへの非静的としてのアクセス
1行目のphpシェルコード
関数呼び出しの結果を参照によって直接渡す。
php> function foo(){return 1; }
php>関数バー(&$ some_arg){}
php> bar(foo());
PHPの厳格な標準:phpでは変数のみを参照で渡す必要があります
1行目のシェルコード
php> $ var =&foo();
PHPの厳格な基準:変数のみを参照により割り当てる必要があります
1行目のphpシェルコード
リテラルや定数など、他の非変数を参照で渡すことは、致命的なエラーではなく、致命的なエラーであることに注意してください。E_STRICT