ホームページ >バックエンド開発 >PHPチュートリアル >厳密な型エラーを「無効」にできないのはなぜですか?
//我当前是php5.3版//按php.ini中的设置(error_reporting = E_ALL | E_STRICT),//本页会显示2个strict类型的错误(见后面代码注释)//ini_set("error_reporting",E_ALL); //写这个,只能关闭2号错误提示//ini_set("error_reporting",E_NOTICE); //写这个也只能关闭2号错误提示//ini_set("display_errors", 0); //这个还是只能关闭2号错误提示//问题就是:为什么子类跟父类同名但不同参的这个strict错误,为什么关不掉? class Person{ public $name; public $age; private function f1($x){ echo "Person中x = " . $x; }}class Teacher extends Person{ public $depart; //所属部门 public function f1($x,$y){ //这里方法参数跟父类同名方法不同, //因此报一个strict类型的错(1号) echo "Person中x = " . $x , ", y=" . $y ; }}$o1 = new Teacher();$o1->f1(1,2);$o1::f1(3,4); //这里使用静态方式调用非静态方法,也报一个strict错(2号)E
re
返信 ディスカッション (解決策)大きな竹、いいえ。
元々は次のとおりです: E_ALL | E_STRICT は実際の「すべてのエラー」情報です。E_ALL は厳密なエラーは表示されないことを示しています (ただし、他のエラーは表示されます)。
E_NOTICE は通知エラーのみが表示されることを示しています。は表示されません);
ini_set("display_errors", 0) を実行してもエラー情報は表示されませんが、それでもエラーは表示されます。PHPにはオーバーロードの概念がないため、サブクラスのメソッドを親クラスのメソッドをオーバーライドする場合、誤解を避けるためにパラメータの数は同じである必要があります。これは E_STRICT レベル チェックの内容の 1 つです
注意すべき点: 構文チェックが最初に行われ、プログラムは後で実行されます
したがって、ini_set("display_errors", 0) であっても構文エラーをブロックすることはできません。
マニュアルには、5.4.0 では E_STRICT が E_ALL の一部になると記載されています
指定しない限り、以前のバージョンは表示されません。
// すべての PHP エラー レポートを閉じる
先ほど送信した csdn ページには、別の 403 が表示されており、アクセスされた IP アドレスが多すぎるため、クローラーが疑われます。認証コードを入力するのが正常になるまでに何度かかかりました。
php 5.3 はデフォルトで E_STRICT レベルのエラーをチェックしません (php 5.4 以降はデフォルトでチェックされます)
error_reporting = E_ALL | E_STRICT は E_STRICT レベルのエラーをチェックしたいことを意味します
E_STRICT レベルのエラーをチェックしたいので、いいえ、「オフ」にできないものはありますか (自分でオンにしました)
PHP にはオーバーロードの概念がないため、サブクラスのメソッドが親クラスのメソッドをオーバーライドする場合、誤解を避けるためにパラメーターの数は同じである必要があります。これは E_STRICT レベル チェックの内容の 1 つです
注意すべき点: 構文チェックが最初に行われ、プログラムは後で実行されます
したがって、ini_set("display_errors", 0) であっても構文エラーをブロックすることはできません。
つまり、php.ini は E_ALL に設定されています | これを書くことで、エラー プロンプト 2 番をオフにすることしかできません。 //ini_set("error_reporting",E_NOTICE); off エラープロンプト 2 番
//ini_set("display_errors", 0); エラーメッセージ 2 番のみクローズ可能
つまり、E_STRICT エラー 1 番(20 行目)はクローズできません。
比較すると、26 行目も E_STRICT エラーです。これらの 3 つのコードのいずれかが閉じられます。
SRICT 中国語で厳格という意味
これは文法チェックではないですか?
E_PARSE は致命的なエラーをチェックします。つまり、エラーが発生した場合、プログラムは中断されます。
E_STRICT は、厳密な構文に従ってチェックされます。
E_NOTICE は、変数が未定義であるかどうかをチェックするために使用されます。プログラムの実行には影響しません
前のエラー メッセージを閉じるにはどうすればよいですか?
1. phpinfo() を使用して、現在動作している php.ini を確認します (複数見つかりますが、実際にシステムによってロードされるのは 1 つです)
2. error_reporting= E_ALL | E_STRICT を次のように変更します。
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
前のエラー メッセージを閉じるにはどうすればよいですか?
1. phpinfo() を使用して、現在動作している php.ini を確認します (複数見つかりますが、実際にシステムによってロードされるのは 1 つです)
2. error_reporting= E_ALL | E_STRICT を次のように変更します。
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
どうしてそんなに頑固なんですか?
E_STRICT はプログラムを終了しません!
最初の厳密型エラーは構文分析フェーズ中に報告されます
2 番目の厳密型エラーは実行フェーズ中に報告されます
前のエラー プロンプトを閉じるにはどうすればよいですか?
1. phpinfo() を使用して、現在動作している php.ini を確認します (複数見つかりますが、実際にシステムによってロードされるのは 1 つです)
2. error_reporting= E_ALL | E_STRICT を次のように変更します。
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
怎么关闭前一个错误提示?
1、用phpinfo()看下,现在起作用的是哪个 php.ini (能找到多个,但有一个是系统真正加载的)
2、把error_reporting= E_ALL | E_STRICT 改为:
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
怎么这么拗呢?
E_STRICT 不会终止程序的运行!
第一个 strict 类型错是在语法分析阶段报出的
第二个 strict类型错是在运行阶段报出的
你做个测试就知道了,并不是什么都要找到理论依据的
echo ini_get('error_reporting'), '<br>'; //看看 php.ini 中定义的值error_reporting(E_ALL ^ E_STRICT); //关闭掉 E_STRICT 级别错误检查echo ini_get('error_reporting'), '<br>'; //再看看修改后的值class Person{ public $name; public $age; private function f1($x){ echo "Person中x = " . $x; }}class Teacher extends Person{ public $depart; //所属部门 public function f1($x,$y){ //这里方法参数跟父类同名方法不同, //因此报一个strict类型的错(1号) echo "Person中x = " . $x , ", y=" . $y ; }}$o1 = new Teacher();$o1->f1(1,2);$o1::f1(3,4); //如果没有关闭 E_STRICT 检查,这里使用静态方式调用非静态方法,也报一个strict错(2号)
Strict Standards: Declaration of Teacher::f1() should be compatible with Person::f1($x) in D:\AMP\web\ide_tmp.php on line 193276730719Person中x = 1, y=2Person中x = 3, y=4
你做个测试就知道了,并不是什么都要找到理论依据的
虽然在程序中关闭了 E_STRICT 检查,但是 1号 错误依然出现
显然对于类定义的错误检查是先于 error_reporting(E_ALL ^ E_STRICT); 进行的