Y's note

PHPでFilterChainを実装してみた

[PHP] : PHPでFilterChainを実装してみた 説明 前処理と後処理を各FilterClassに実装してFilterをChainさせます。 処理の順番としては ■前処理(prefilter) filterA → filterB → filterC ■後処理(postfilter) filterC → filterB → filterA というように後処理は前処理と逆に行われます。 FilterChainクラス class FilterManager { private static $_filters = array(); private static $_index = 0; private function __construct(){} public function build( array $filters ) { foreach( $filters as $filter ) { $filter_name = ucfirst( $filter ) . 'Filter'; $file_name = $class_name . '.php'; //require_once( './Filter.php' ); require_once( $file_name ); self::add( $filter_name ); } } static private function add( $filter ) { self::$_filters[] = $filter; } static public function execute() { // prefilter foreach( self::$_filters as $filter ) { $filter::prefilter(); ++self::$_index; } // postfilter foreach( array_reverse( self::$_filters ) as $filter ) { $filter::postfilter(); --self::$_index; } } static public function getCurrentFilter() { return self::$_filters[ self::$_index ]; } } FIlterChainを構築するbuildメソッド

magic method

[PHP] : magic method phpのマジックメソッドについて挙動を確認してみました。 とりあえずは代表的なもののみをピックアップ。 <?php class MagicMethod { private $data_ = array(); public function __construct() { echo “call construct \n”; } public function __destruct() { echo “call destruct \n”; } public function __get( $key ) { echo “call _get \n”; return $this->data[ $key ]; } public function _set( $key, $name ) { $this->data[ $key ] = $name; echo “call __set \n”; } public function toString() { return CLASS__; }

API Frameworkの設計

[design pattern] : API Frameworkの設計 クラス設計図 やりたいこと APIのように同一の処理の流れを組み込む場合、TemplateMethodパターンを利用してFrameWork化することができると思います。 PHPのFrameWorkはたくさん世の中に出回っていると思いますが、必要用途のモノだけを揃えた軽量FrameWorkが存在しないので 自作します。 1.APIを作成する人はModelクラスだけに手を入れる。Controllerも修正可能にしますが、極力修正させたくない。 2.Validate,DB接続,View機能はFrameWorkとして揃える。 シーケンス図 処理の流れ 1. ControllerはApplicationからリクエストされたURIを取得します。 2. ApplicationからリクエストされたURIを元に設定ファイルを読み込みます。( 設定ファイルはphpのiniファイル形式とする予定 ) 3. ApplicationからリクエストされたURIを元に必要なModelクラスを読み込みます。 4. Modelクラス内部でApplicationからリクエストされたパラメータを取得します。(API作者が実装) 5. Modelクラスは取得したパラメータのvalidateを行ないます。(API作者が実装) 6.DBに接続が必要な場合はDBクラスとConnectionを張って、データを取得します。(API作者が実装) 7.ModelクラスはDBから取得したデータの整形を行ないます。(API作者が実装) 8.ControllerにModelの結果を返却します。 9.ControllerにてView用のデータ整形を行ないます。 10.ApplicationにAPIとしての結果を返却します。 実装 各パートの実装はちょくちょくやっています。 本気でやったら数時間で終わりそうですね。

Singleton

[PHP] : Singleton Singletonパターン 1 外部からインスタンスを生成させない 2 インスタンスをひとつだけ生成を許す ということを実現するデザインパターン。 Singletonクラス class singleton { private static $instance_ = null; private function __construct() { echo "make instance \n"; } public static function getInstance() { if( is_null( self::$instance_ ) ) { self::$instance_ = new singleton(); } return self::$instance_; } } client 外部のclientからnewをしようとするとerrorになる。 インスタンスを取得する場合はクラスメソッドのgetInstance()を利用する。 //error $instance = new singleton(); //ここはエラーになる。 //success $instance = singleton::getInstance(); 利用方法 http://www.

vimgrep

[vim] : vimgrep 概要 vim7からvimにgrep機能が追加されており、いろいろな文字コードにおけるマルチバイト文字列検索なども可能に可能になっているようです。実際につかってみたところ日本語検索は可能なのですが、処理速度がどうしても気になってしまいます。vim開発者がんばれ。日本語検索をおこないたい場合はおすすめです。 vimを開いてコマンドモードで以下を実行します。 :vimgrep /partern/j **/*.php | cwin オプション オプション 説明 vimgrep vimgrepを実行します。 /partnern/ 正規表現を記述します。 j 検索の先頭にかかったファイルを開きません。 ** 再帰的に検索をしてくれます。 cwin 別windowにファイル一覧を表示。選択でファイルを開くことが可能