PHPTypeSafeで目から鱗が落ちた
PHP5から導入されたタイプヒンティングを、とある方法で拡張してstringやint、boolなどのスカラー値に対しても使えるようにしたライブラリです。
Today I released the first public version of my new library PHPTypeSafe. It provides the ability to use PHPs Type Hinting feature for scalar values.
PHP5.3以降対応で、phar形式で提供されています。つーか、PHP本体に入れば楽なんだけどなぁ。。。
どのように書けるかというと、こんな感じ。barメソッドに注目。
<?php require 'com.maxhorvath.phptypesafe.phar'; class Foo { public static function bar(string $msg, int $counter) { echo $counter . '. run: ' . $msg . "\n\n"; } } $obj = new Foo(); $obj->bar('test', 1); Foo::bar(false, 2); // 引数の型が合っていない
PHP5.3.0α2で実行すると。。。なんかechoの部分がうまく出なかったんですが、
$ php -n sample.php ???????????????????????????????????????????????????????????????????????????????????? Fatal error: Uncaught exception 'ErrorException' with message 'Argument 1 passed to Foo::bar must be of type string, boolean given, called in ... $
な感じで例外(ErrorException)が投げられます。ちゃんと「Argument 1 passed to Foo::bar must be of type string, boolean given」となっているのが分かりますかね。
で、このライブラリが面白いのは、pharで提供されているところじゃなくて、これを実現している方法。PHP5で上記のFooクラスのように書くと「string」や「int」がオブジェクト型として認識されるので、
Catchable fatal error: Argument 1 passed to Foo::bar() must be an instance of string, string given, called in ...
となりますが、PHPTypeSafeではこのCatchable fatal error(E_RECOVERABLE_ERROR)を独自のエラー処理関数で処理しています。この部分の大まかな流れを抜き出すとこんな感じ。
<?php set_error_handler('errorHandler'); function errorHandler($code, $message, $file = '', $line = 0, array $context = array()) { if ($code === E_RECOVERABLE_ERROR) { printf("message:%s\n", $message); } return call_user_func(...) }
詳細は、ErrorHandlerクラスを参照。これに気づいたときは目から鱗。感動しました。
また、
- PHP5.3から導入される名前空間
- PHP5.3から標準になるphar
- cruisecontrol+phpUnderControl+PHPUnit+phpt
をガッツリ使っているので、非常に良いサンプルになりそうです。
ちなみに、com.maxhorvath.phptypesafe.pharを
<?php try { $p = new Phar(dirname(__FILE__) . '/com.maxhorvath.phptypesafe.phar'); } catch (Exception $e) { die($e->getMessage() . PHP_EOL); }
な感じで読み込もうとしたんですが、
$ php -v PHP 5.3.0alpha2 (cli) (built: Sep 2 2008 11:52:39) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2008 Zend Technologies with Xdebug v2.0.3, Copyright (c) 2002-2007, by Derick Rethans $ cat -n construct.php 1 <?php 2 try { 3 $p = new Phar(dirname(__FILE__) . '/com.maxhorvath.phptypesafe.phar'); 4 } catch (Exception $e) { 5 die($e->getMessage() . PHP_EOL); 6 } $ ls com.maxhorvath.phptypesafe.phar com.maxhorvath.phptypesafe.phar $ php -n construct.php phar "/path/to/com.maxhorvath.phptypesafe.phar" SHA1 signature could not be verified: broken signature $
と怒られてしまいました。。。むーん。
第2回設計勉強会も企画します
会場の都合もあり、追加が難しい状況です。運営って難しい。。。
参加枠を追加できるかどうか確認中ですので、しばらくお待ちを。。。
で、まだ1回目が開催されてませんが、同じ内容で第2回設計勉強会も企画しようと思います。時期は10月中旬目標で。
次回は
- 募集開始時期を指定
- 発表者と第1回に参加できなかった方を先行募集(枠半分ぐらい?)
しますので、よろしくお願いしますm(__)m
2008年8月のDo You PHPはてなアクセスランキング
Do You PHPはてなのアクセスTOP10(8月分:2008/08/01〜2008/08/31)を出してみました。各エントリのパーマリンクランキングです。
- Firefox3.0.1に上げるとTab Mix Plusが動かなくなったので直してみた - Do You PHP はてな
- そろそろ「?:演算子」について一言言っておくか - Do You PHP はてな
- Paros使ってみた - Do You PHP はてな
- 出力バッファとflush()・ob_flush() - Do You PHP はてな
- 日記投稿APIを追加したServices_MixiAPI 0.2.0リリース - Do You PHP はてな
- mixiのAPIが増えていたので、Services_MixiAPI作ってみた - Do You PHP はてな
- 「multipart/form-data使ってアップロード」で助けて〜 - Do You PHP はてな
- WEB+DB PRESS Vol.46が届いた - Do You PHP はてな
- CF-R4のメモリを増設 - Do You PHP はてな
- 「設計」勉強会やりたい - Do You PHP はてな
7月末にFx3リリース、ということでTab Mix Plusネタがダントツでした。すでに開発版の新バージョンがリリースされているので、すでにお役ご免ですね。
2位の「?:演算子」は、id:MugeSoさんの使える場面の例とか、いろいろと勉強になりました。ありがとうございます:-)
あと、Services_MixiAPI直してみたりとか、設計勉強会やりたいとかありましたが、ここに来てなぜかCF-R4のメモリ増設ネタが再燃。。。
設計勉強会は、募集の仕方がまずかったです。すみません。。。第2回設計勉強会も企画します - Do You PHP はてなにも書きましたが第2回を企画しますので、乗り遅れた方、次回是非お願いします。
こんな感じで今月もぼちぼちやっていきますので、よろしくお願いします。