ホームページ  >  記事  >  バックエンド開発  >  厳密な型エラーを「無効」にできないのはなぜですか?

厳密な型エラーを「無効」にできないのはなぜですか?

WBOY
WBOYオリジナル
2016-06-23 13:43:251116ブラウズ

//我当前是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

返信 ディスカッション (解決策)
Error_reporting = E_ALL^E_Strict

Error_reporting = E_ALL^E_Strict

大きな竹、いいえ。

元々は次のとおりです: E_ALL | E_STRICT は実際の「すべてのエラー」情報です。

E_ALL は厳密なエラーは表示されないことを示しています (ただし、他のエラーは表示されます)。

E_NOTICE は通知エラーのみが表示されることを示しています。は表示されません);

ini_set("display_errors", 0) を実行してもエラー情報は表示されませんが、それでもエラーは表示されます。
ここが私の混乱の原因です。 str は何があってもオフにできないようです。


これは可能ですか error_reporting (E_ALL & ~ E_STRICT);

PHP 5.3 はデフォルトで E_STRICT レベルのエラーをチェックしません (php 5.4 以降はデフォルトでチェックされます)
error_reporting = E_ALL | する必要があることを意味しますE_STR ICTレベルのエラーを確認する
E_STRICTレベルのエラーを確認したいので、オフにできない「オフ」はありません(自分でオンにする)

PHPにはオーバーロードの概念がないため、サブクラスのメソッドを親クラスのメソッドをオーバーライドする場合、誤解を避けるためにパラメータの数は同じである必要があります。これは E_STRICT レベル チェックの内容の 1 つです

注意すべき点: 構文チェックが最初に行われ、プログラムは後で実行されます
したがって、ini_set("display_errors", 0) であっても構文エラーをブロックすることはできません。

マニュアルには、5.4.0 では E_STRICT が E_ALL の一部になると記載されています
指定しない限り、以前のバージョンは表示されません。


// すべての PHP エラー レポートを閉じる

error_reporting(0);


先ほど送信した 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 つのコードのいずれかが閉じられます。


つまり、これは同じ E_STRICT エラーであり、一方はオフにすることができますが、もう一方はオフにすることはできません。
私のウェブサイトの表現は人々に曖昧さや誤解を与えていませんか?

あなたが言及した文法チェックの質問です。しかし、これは文法チェックのエラーではありません。構文チェックのエラー メッセージは E_PARSE です。実際に最初にチェックされてから実行されます。構文が間違っているため、まったく実行されません。しかし、私のプログラムは実行でき、最後の行で結果を出力できます。



SRICT 中国語で厳格という意味です
これは文法チェックではないですか?

E_PARSE は致命的なエラーをチェックします。つまり、エラーが発生した場合、プログラムは中断されます。
E_STRICT は、厳密な構文に従ってチェックされます。
E_NOTICE は、変数が未定義であるかどうかをチェックするために使用されます。プログラムの実行には影響しません。
ini_set('display_errors','off');

SRICT 中国語で厳格という意味
これは文法チェックではないですか?

E_PARSE は致命的なエラーをチェックします。つまり、エラーが発生した場合、プログラムは中断されます。
E_STRICT は、厳密な構文に従ってチェックされます。
E_NOTICE は、変数が未定義であるかどうかをチェックするために使用されます。プログラムの実行には影響しません



xuzuning モデレーターと fdipzone に感謝します。特に司会者の頑張りのおかげです。

fdipzone が提供するアドバイスは機能しません。

次に、モデレーターの返信に対して具体的に返信します。

まず第一に、おそらく私たちは両方とも「文法チェック」についての理解が異なっています。私が理解している構文チェックとは、プログラムを実行する前に、まずその構文が「正しい」かどうか、つまり「実行に適しているか」(または実行できるか)をチェックすることを意味します。このチェックはプログラムを実行する前に行われます。このような構文エラーが見つかった場合、操作は実行されませんが、E_PARSE エラーが直接報告されます。たとえば、最も単純で最も一般的なものはセミコロンが欠落していることです。

そして、このステップがチェックされた後、プログラムが実行を開始します。プロセスの実行中に何らかのエラーが発生すると (これを実行時エラーと呼びます)、それに応じてエラー メッセージが表示されますが、ほとんどのエラーは「実行を継続」できます (ただし、エラー メッセージも出力されます)。現時点では、「実行を停止」するエラーは 2 種類だけであることがわかっています。それは、あなたが言及した E_ERROR とユーザー定義エラー E_USER_ERROR です。

E_NOTICE、E_WARMING (E_STRICT を含む) など、さまざまな状況でエラーが発生します。これらはエラー後も実行され続け、php.ini 設定項目 error_reporting (全世界に影響します) または ini_set('error_reporting を通じて設定できます) ', .... .) (このページに影響します) を使用して、エラー メッセージをオフにする (つまり、表示されない) ように設定します。たとえば、この例の最後の E_STRICT エラー (26 行目) を閉じることができます。この例のエラー No. 1 と 2 は両方とも E_STRICT タイプのエラーであり、前述の構文チェック エラーであることに注意してください。ご存知のとおり、これら 2 つの場所は確かに「緩い構文」ですが、どちらの場所も引き続き実行して結果を出力できることに注意してください。エラー No. 1 は、サブクラスの f1 メソッドのパラメータが親クラスのパラメータと異なるというものですが、プログラムの実行は妨げられません。エラー 2 は、静的メソッドを使用して非静的メソッドを呼び出しているため、プログラムの実行は妨げられません。厳密に言えば、これらは両方とも (あなたの理解によると) 「文法上の誤り」ですが、結果として、一方は閉じることができ、もう一方は閉じることができません。

私の問題は、これら 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 を確認します (複数見つかりますが、実際にシステムによってロードされるのは 1 つです)
2. error_reporting= E_ALL | E_STRICT を次のように変更します。
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT


1. php.ini ファイルには問題ありません。
2. 提供された方法はまだ機能しません。

どうしてそんなに頑固なんですか?
E_STRICT はプログラムを終了しません!

最初の厳密型エラーは構文分析フェーズ中に報告されます
2 番目の厳密型エラーは実行フェーズ中に報告されます


前のエラー プロンプトを閉じるにはどうすればよいですか?
1. phpinfo() を使用して、現在動作している php.ini を確認します (複数見つかりますが、実際にシステムによってロードされるのは 1 つです)
2. error_reporting= E_ALL | E_STRICT を次のように変更します。
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT


1. php.ini ファイルには問題ありません。
2. 提供された方法はまだ機能しません。


phpinfo() を使用して php.ini の場所を確認したことがありますか? 変更したものが使用しているものではない可能性があります。



怎么关闭前一个错误提示?
1、用phpinfo()看下,现在起作用的是哪个 php.ini  (能找到多个,但有一个是系统真正加载的)
2、把error_reporting= E_ALL | E_STRICT  改为:
         error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT


1、php.ini文件没问题。 
2、你提供的这个方法还是不行啊。


你用phpinfo()核实php.ini的位置了吗,有可能你改的不是你在用的。

抱歉。我昨天的回复过于草率。我本意是指在php文件的脚本代码中使用ini_set("error_reporting",E_ALL) (或把E_ALL改为其他值)的方式,能关闭2号错误,却不能关闭1号错误,因此而求助(提问),因此没测试真正去改php.ini。

今天测试,确实能关闭。实际上,则我自己给出的那几条设置值,只要在php.ini中设置,也都能生效。

但我的问题依然存在,那就是:同样是E_STRICT错误,为什么我给的例子中,使用ini_set("error_reporting",E_ALL) (或把E_ALL改为其他值),2号能关闭,而1号不能关闭?有关此问题,请再看我后续回复版主的帖子。

怎么这么拗呢?
E_STRICT 不会终止程序的运行!

第一个 strict 类型错是在语法分析阶段报出的
第二个 strict类型错是在运行阶段报出的



好吧,算我拗,我也认。你的认真,负责,我有机会一定会跟蒋涛说说的。

也许就是如你所说的,虽然都是E_STRICT类型的错误,但第一个是在语法分析阶段报出的,第二个是运行阶段报出的。那么如果这样的话,就跟我们通常理解的,使用ini_set("error_reporting",XXX),只要设置XXX的合适值就可以关闭某些类型的错误, 有出入了。

因此,是否可以这样说,同样类型的错误提示信息,使用ini_set在脚本中设置,有的能关闭,有的不能关闭?那具体又是,怎么样的能关闭,怎么样的不能关闭呢?这个知识在哪里能查到?

另外,同样是“语法检查”错误,有的是让程序无法执行,报E_PARSE错误,有的是能让程序执行,如你所说的,但报E_STRICT错误。就算按你说的,E_PARSE是致命语法错误,而E_STRICT能继续运行,则又如何区分这两者呢???当然,或许这已经不算什么问题了。

还有,对于类似我提出的这个错误,在php.ini文件中能关闭提示,而在脚本中不能关闭,但其他情况的错误提示,似乎两边都有一致性,则又做何解释?

最后,我就是拗,有本事你答我呀

??最后的最后,我的玩笑希望你懂,至少不介意。

你做个测试就知道了,并不是什么都要找到理论依据的

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); 进行的

你做个测试就知道了,并不是什么都要找到理论依据的

虽然在程序中关闭了 E_STRICT 检查,但是 1号 错误依然出现
显然对于类定义的错误检查是先于 error_reporting(E_ALL ^ E_STRICT); 进行的



嗯,我前一贴已经认可了你的说法,至于测试,我自然是要做,而且本来就是因为自己遇到了这样的情形,希望得到一定的解释或解决而已。

那既然你已经说了“并不是什么都要找到理论依据的”,就说明我最后提出的3个问题,就没有必要去纠结了,是么?

好吧。世界如此不完美,我没有权利自己做不到的事情,去要求这个世界:)
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。