フロント コントローラーがすべてを制御するようになったので、それを使ってさらに多くのことができるようになりました。 !
Windows では php.ini の display_errors がデフォルトでオンになっていることがわかっていますが、Linux ではこれは非常に面倒なので、設定ファイルで設定できます。 debug 属性は、デバッグがオンになっているかどうかを表します。デバッグがオンになっている場合、プログラム内で例外が発生すると、大量のデバッグ情報が出力されます。ここでは、非常に簡単に設定しただけですが、実際のフレームワークのデバッグ機能はそれほど単純ではありません。
まず、デバッグがオンになっている場合、デバッグ情報が表示されるように実装します。デバッグモード: プログラムに構文エラーまたはその他のエラーがある場合、エラー情報が表示されます。オフにすると、エラー情報は表示されません。
次に、FrontController の __construct 関数を変更します。
01 | private function __construct() { |
02 | C(Config::factory(Config::PHP)); //写入配置信息 |
プライベート関数 __construct() {
03 | session_start(); |
04 | if(true === C('debug')) { |
02
05 | echo 'debug mode:'; |
06 | ini_set('display_errors','On'); |
07 | error_reporting(C('errorReporting')); |
08 | } else { |
09 | error_reporting(0); |
10 | ini_set('display_errors','Off'); |
11 | } |
12 | } |
この関数では主にデバッグ機能の追加と、デフォルトでセッションが開かれるPHPのエラー設定はphp.iniのerror_reporting関数とdisplay_errors項目が主なため、Withを設定するだけで済みます。この 2 つの項目を使用すると、オペレーティング システムが何であっても、デバッグ情報を適切に制御できます。
PHP プログラムを書いたことがある人なら誰でも、PHP のデフォルトのタイムゾーンが中国ではないことを知っているかもしれません。そのため、date 関数を使用して現在のタイムスタンプを取得すると、何かが間違っていることがわかります。そのため、実際、これはフレームワークによって完全に完了できます。設定ファイルにタイム ゾーンの値を書き込むだけで、フレームワークは date_default_timezone_set 関数を呼び出してタイム ゾーンを設定します。
この場合、FrontController の __construct 関数は次のようになります:
01 | private function __construct() { |
02 | C(Config::factory(Config::PHP)); //写入配置信息 |
プライベート関数 __construct() {
03 | session_start(); |
04 | date_default_timezone_set(C('timeZone')); |
02
05 | if(true === C('debug')) { |
06 | echo 'debug mode:'; |
07 | ini_set('display_errors','On'); |
08 | error_reporting(C('errorReporting')); |
09 | } else { |
10 | error_reporting(0); |
11 | ini_set('display_errors','Off'); |
12 | } |
13 | } |
Toper のソース コードの FrontController.class.php ファイルを見てみると、このファイルには非常に多くのコードが含まれていることがわかりますが、これは私がここで書いているものとは異なります。 20 OK を超えるだけです。これは実際には、フレームワークの FrontController が、CSRF 攻撃の防止、カスタム構成項目のサポートなど、他の多くのことも実行する必要があるためですが、スペースの理由でそれを書くことはできません。
実際のフレームワークでデバッグ モードを設定すると、単に debug mode: のような文字列が出力されるわけではありません。これについては誰でも理解しておく必要があります。
Java を勉強したことがある人なら、Java のすべてのオブジェクトに基本クラス Object があることを知っています。基本クラスはフレームワークで使用できますか?
この基本クラスはどのような機能を実行しますか? たとえば、クラスの存在しないメソッドが呼び出された場合、基本クラスでこのメソッドをオーバーライドすると、他のすべてのメソッドが呼び出されます。クラスはこのクラスを継承しており、これらのクラスのメソッドを呼び出す際に、メソッドが存在しない場合には当然このメソッドに何らかの対処が行われるため、メソッドが存在しないことを直接入力するよりも優れています。 。
この基底クラスを一時的に Base と呼びます。Toper では、この基底クラスを Tp と呼びます。
まず Base.php のソースコードを投稿します:
01 |
02 | class Base { |
03 | public function __call($name,$arguments) { |
04 | if(true === C('debug')) { |
05 | echo 'not exists method:'; |
06 | echo 'the name is :'; |
07 | var_dump($name); |
08 | echo 'the arguments is :'; |
09 | var_dump($arguments); |
10 | } |
11 | throw new Exception('not exists method'); |
12 | } |
13 | } |
デバッグを有効にすると、存在しないメソッド名とパラメータが出力され、開発者がエラーが発生した場所を見つけやすくなります。もちろん、デバッグがオンになっているかどうかに関係なく、例外は必ずスローされます。もちろん、オンラインの場合、このような問題が発生した場合、例外情報をページに直接表示できますか? いや、例外情報をログ ファイルに出力してから、ページがエラー ページにジャンプするのが最善です。これらのクラスは Exception を継承し、デバッグがオンになっているかどうかを決定し、デバッグがオンになっている場合は、例外情報がログに出力されます。ファイルを開き、エラー ページに移動します。具体的にはどうすればよいでしょうか。実際に試してみてください。 ! !
私が書いたすべての php ファイルで php の終了文字を書いていないことに気づいたかどうかわかりませんが、これはなぜですか?
実際は非常に簡単です。例を挙げてみましょう:
現在、a.php と b.php があります。a.php のソースコードは次のとおりです。
<テーブル>
1 |
2 | //这个地方貌似没有输出哦 |
1 |
2 | include a.php |
3 | session_start(); |
4 | ?> |
これを実行すると、ヘッダーがすでに送信されているという警告がスローされることがわかります。なぜですか?
主な理由は、PHP ターミネーターが呼び出された後も a.php にいくつかの空白行があるため、PHP はそれが HTML コードであると認識します。この場合、session_start が呼び出される前にヘッダー出力がすでに存在していることがわかります。 、session_start を呼び出す前に何も出力できないため、プログラムは警告をスローします。
?> を使用すると、プロジェクトが大きくコード量が多い場合、このような問題を見つけるのが難しく、非常に手間がかかります。コードのメンテナンスには重大な問題があるため、PHP ファイルの最後に ?> を記述しないことが最善です。これは、zend によって公式に推奨されているアプローチでもあります。