Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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クラスを参照。これに気づいたときは目から鱗。感動しました。


また、

をガッツリ使っているので、非常に良いサンプルになりそうです。


ちなみに、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回設計勉強会も企画します

via. 設計勉強会 - events.php.gr.jp

会場の都合もあり、追加が難しい状況です。運営って難しい。。。


参加枠を追加できるかどうか確認中ですので、しばらくお待ちを。。。

で、まだ1回目が開催されてませんが、同じ内容で第2回設計勉強会も企画しようと思います。時期は10月中旬目標で。

次回は

  • 募集開始時期を指定
  • 発表者と第1回に参加できなかった方を先行募集(枠半分ぐらい?)

しますので、よろしくお願いしますm(__)m

2008年8月のDo You PHPはてなアクセスランキング

Do You PHPはてなのアクセスTOP10(8月分:2008/08/01〜2008/08/31)を出してみました。各エントリのパーマリンクランキングです。

  1. Firefox3.0.1に上げるとTab Mix Plusが動かなくなったので直してみた - Do You PHP はてな
  2. そろそろ「?:演算子」について一言言っておくか - Do You PHP はてな
  3. Paros使ってみた - Do You PHP はてな
  4. 出力バッファとflush()・ob_flush() - Do You PHP はてな
  5. 日記投稿APIを追加したServices_MixiAPI 0.2.0リリース - Do You PHP はてな
  6. mixiのAPIが増えていたので、Services_MixiAPI作ってみた - Do You PHP はてな
  7. 「multipart/form-data使ってアップロード」で助けて〜 - Do You PHP はてな
  8. WEB+DB PRESS Vol.46が届いた - Do You PHP はてな
  9. CF-R4のメモリを増設 - Do You PHP はてな
  10. 「設計」勉強会やりたい - Do You PHP はてな

7月末にFx3リリース、ということでTab Mix Plusネタがダントツでした。すでに開発版の新バージョンがリリースされているので、すでにお役ご免ですね。
2位の「?:演算子」は、id:MugeSoさんの使える場面の例とか、いろいろと勉強になりました。ありがとうございます:-)
あと、Services_MixiAPI直してみたりとか、設計勉強会やりたいとかありましたが、ここに来てなぜかCF-R4のメモリ増設ネタが再燃。。。

設計勉強会は、募集の仕方がまずかったです。すみません。。。第2回設計勉強会も企画します - Do You PHP はてなにも書きましたが第2回を企画しますので、乗り遅れた方、次回是非お願いします。

こんな感じで今月もぼちぼちやっていきますので、よろしくお願いします。