5.8. メソッド引数を検証するStrictInterceptor

5.8.1. Exampleについて

StrictInterceptorのExampleは、example/misc/strict にあります。 各クラスファイル、設定ファイル、ディレクトリ構成は次になります。

example/misc/strict/
 +-- classes/
 |    +-- sample/
 |    +-- StrictAnnotationFactory.php
 |    +-- StrictException.php
 |    +-- StrictInterceptor.php
 +-- execute.php
      
clasesディレクトリにある次の3つのクラスがStrictInterceptorを使用するために必要となります。
  • StrictAnnotationFactory.php
  • StrictException.php
  • StrictInterceptor.php


5.8.2. StrictInterceptorの概要

StrictInterceptorはメソッド呼び出し時にメソッド引数と戻り値について型チェックをおこなうInterceptorです。 メソッド引数や戻り値の型の指定はコメントアノテーションで行います。

  • @param メソッドの引数の型を指定
  • @return メソッドの戻り値の型を指定
@paramアノテーションは、1引数にひとつ指定します。例として、Calcクラスのaddメソッドのアノテーションを次に示します。
<?php
class Calc {
    /**
     * @param numeric $a
     * @param numeric $b
     * @return integer
     */
    public function add($a, $b) {
        return $a + $b;
    }
}

型のチェックは、指定された型がクラスの場合は、そのクラスに属するインスタンスかどうかが確認されます。 指定された型のクラスが存在しない場合は、指定された型の先頭に「is_」を付加した関数を使用してチェックを実施します。 型指定がintegerの場合は、is_integer関数が使用されます。また、型の指定は、「|」で区切ることで複数指定できます。 複数の型が指定されている場合は、ORチェックが成されます。


5.8.3. StrictInterceptorをアスペクトする

例として、次のようなHogeクラスを作成します。

  • classes/sample/Hoge.php
<?php
namespace sample;
class Hoge {
    /**
     * @param numeric $a is_numeric関数で確認されます。
     * @param string  $b is_string関数で確認されます。
     * @return object is_object関数で確認されます。
     */
    public function foo($a, $b) {
        return new StdClass;
    }

    /**
     * @param sample\Huga  $a Hugaクラスかどうか、または、is_subclass_of関数で確認されます。
     * @param mixed $b 型チェックを行いません。
     * @return null|sample\Huga is_null関数で確認されます。
     *                           またはHugaクラスかどうか、またはis_subclass_of関数で確認されます。
     */
    public function bar(sample\Huga $a, $b) {
        return null;
    }
}
class Huga{}

実行スクリプトは次になります。HogeクラスにStrictInterceptorを自動アスペクトしています。

  • sample.php
<?php
require_once(dirname(dirname(dirname(__FILE__))) . '/example.inc.php');
use seasar\container\S2ApplicationContext as s2app;

s2app::import(dirname(__FILE__) . '/classes');
s2app::registerAspect('StrictInterceptor', '/Hoge/');
$hoge = s2app::get('Hoge');

$obj = $hoge->foo(1, 'abc');
$obj = $hoge->bar(new sample\Huga, 100);

try {
    $obj = $hoge->foo(1, 2);
} catch(StrictException $e) {
    print $e->getMessage() . PHP_EOL;
}

2番目のfooメソッドの実行では、第2引数が文字列ではないためStrictExceptionが発生します。 「argument[1] type unmatch. expected string」とメッセージが表示されます。



© Copyright The Seasar Foundation and the others 2005-2010, all rights reserved.