2011,04,01, Friday
PHPでErrorExceptionを使ったエラーハンドリング処理を実装し、よりセキュアな作りに挑戦しようとしたんだけど、Warningやらなんやら投げるようしたら使い勝手が悪くなりすぎた。
っていうか、一番取りたいERRORは有無を言わさずプログラム停止するって仕様はどうなのよ?
未定義の関数を呼び出した時のFatalErrorくらい拾ってほしい…。
ERROR以外は、ページ表示した後 WARNING何件 NOTICE何件、詳細はこうって感じで出せるようにならないかなぁ?
WARNING程度で ERRORと同じ処理をするのは不便すぎるなぁ。
で、こうするのがいいんじゃないかなと思った方法を掲載してみます~
/**
* Error Handlerの定義
* Warningや Noticeなど、発生したメッセージをエラーハンドリングし、
* ErrorExceptionオブジェクトにしておいて、stdClassオブジェクトのプロパティに保存していきます。
* これを Zend_Registryで保持しておくので、後でどこからでも取り出すことができます。
*/
{
// (E_ALL | E_STRICT)発生時に呼び出される関数を登録します。
set_error_handler(
function ($errno, $errstr, $errfile, $errline, $errcontext)
{
// レジストリに登録があるかを確認し、あれば取り出します。
if (Zend_Registry::isRegistered('myErrorException'))
{
$myerr = Zend_Registry::get('myErrorException');
}
// なければ stdClassオブジェクトを生成し、
// エラーを保存するプロパティを用意して、
// レジストリに登録します。
else
{
$myerr = new stdClass;
$myerr->e = array();
Zend_Registry::set('myErrorException', $myerr);
}
// ErrorExceptionオブジェクトを生成し、プロパティに格納します。
$myerr->e[] = new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
, (E_ALL | E_STRICT)
);
}
すべての処理が終わった後、これを煮るなり焼くなりすればいいかと^^
Zend_Logで、Firebugのコンソールへ送る方法があるようなので、それを使う実装ができるといいんじゃないかなぁって思います。
あ、これ、PHP5.3以降対応です。無名関数のところを書き変えれば PHP5以上で動作すると思います。
関連する関数・ライブラリについては、以下を参照のこと。
PHPマニュアル set_error_handler()
http://jp.php.net/manual/ja/function.set-error-handler.php
ZendFrameworkマニュアル Zend_Registry
http://framework.zend.com/manual/ja/zend.registry.html
2008,01,21, Monday
PHP/PEARライブラリの Flexy というテンプレートエンジンを触って見ました。
Flexyの特徴としては、タグの中に属性値として if処理と foreach処理が指定できるので、WYSIWYGソフトでHTML編集をした際にレイアウトが崩れにくいというのがあげられます。
詳しい内容とインストール手順は、他サイトに任せます。
その際に、いくつか動作がおかしい点を見つけデバッグしました。
バグというよりは、PHP5での動作を考慮していないのだと思います。ファイルの先頭に、「PHP Version 4」と書かれていますし。
---
追記&再編集: 08/02/24
08年1月末に、まさかの新バージョン(v1.31)リリースです!^^
ちょっとびっくりしました。もう保守されないのだとばかり思っていたので。ただ、まだ PHP4 向けのようですが。
---
続き▽