アノテーションの読み取り | Annotation & Reflection

Sabel_Annotation_Readerクラス を使用するとコメントの内容を取得することができます。クラスのアノテーションを取得するには readClassAnnotation()メソッド を使用します。引数はクラス名、もしくはインスタンスです。
/**
 * @hoge a b
 * @fuga c d
 */
class MyClass
{
  
}
$reader = Sabel_Annotation_Reader::create();
$annotations = $reader->readClassAnnotation("MyClass");

echo $annotations["hoge"][0][0];  // "a"
echo $annotations["hoge"][0][1];  // "b"
echo $annotations["fuga"][0][0];  // "c"
echo $annotations["fuga"][0][1];  // "d"
結果は連想配列になり、キーはアノテーションの名前(@XXX の XXX の部分)になります。値はスペース区切りで複数記述することが可能であり、それらの値には配列の0番目、1番目...というようにアクセスできます。同じキーが複数あっても構いません。それらは順番に0番目、1番目...とアクセスできます。
/**
 * @hoge a b
 * @hoge c d
 */
class MyClass
{
  
}
echo $annotations["hoge"][0][0];  // "a"
echo $annotations["hoge"][0][1];  // "b"
echo $annotations["hoge"][1][0];  // "c"
echo $annotations["hoge"][1][1];  // "d"
メソッドのアノテーションを取得するには readMethodAnnotation()メソッド を使用し、引数にクラス名・メソッド名を渡します。第1引数にはクラス名ではなくインスタンスを渡すことも可能です。
class MyClass
{
  /**
   * @foo a
   * @foo b c
   * @bar d
   */
  public function myMethod()
  {
    
  }
}
$reader = Sabel_Annotation_Reader::create();
$annotations = $reader->readMethodAnnotation("MyClass", "myMethod");

echo $annotations["foo"][0][0];  // "a"
echo $annotations["foo"][1][0];  // "b"
echo $annotations["foo"][1][1];  // "c"
echo $annotations["bar"][0][0];  // "d"

クオートやスペースが含まれる値を使用する

アノテーションの値がスペースやクオート含む場合、それをクオートで囲む必要があります。値がシングルクオートを含む場合は全体をダブルクオートで囲み、ダブルクオートを含む場合は全体をシングルクオートで囲みます。
※シングルクオートやダブルクオートで囲まれていない場合、前後のスペースは無視されます。
/**
 * @hoge ' "a" '    "  'b'  "    c    d
 */
class MyClass
{
  
}

$reader = Sabel_Annotation_Reader::create();
$annotations = $reader->readClassAnnotation("MyClass");

echo $annotations["annot"][0][0];  // " "a" "
echo $annotations["annot"][0][1];  // "  'b'  "
echo $annotations["annot"][0][2];  // "c"
echo $annotations["annot"][0][3];  // "d"
また、囲むクオート(ダブルクオートもしくはシングルクオート)が値に含まれる場合は、値の中のそれをバックスラッシュでエスケープしてください。
/**
 * @annot ' \'"a"\' '
 */
class MyClass
{
  
}

$reader = Sabel_Annotation_Reader::create();
$annotations = $reader->readClassAnnotation("MyClass");

echo $annotations["annot"][0][0];  // " '"a"' "

リフレクション

これまでアノテーションの読み取りに Sabel_Annotation_Reader を用いてきましたが、リフレクションオブジェクトから読み取ることもできます。
/**
 * @hoge a b
 */
class MyClass
{
  /**
   * @fuga c d
   */
  public function myMethod()
  {
    
  }
}

$ref = new Sabel_Reflection_Class("MyClass");
$classAnnotation = $ref->getAnnotations();

var_dump($classAnnotation);
  // array (
  //   ["hoge"] =>
  //   array (
  //     [0] =>
  //     array (
  //       [0] => "a"
  //       [1] => "b"
  //     )
  //   )
  // )

$method = $ref->getMethod("test");
$methodAnnotation = $method->getAnnotations();

var_dump($methodAnnotation);
  // array (
  //   ["fuga"] =>
  //   array (
  //     [0] =>
  //     array (
  //       [0] => "c"
  //       [1] => "d"
  //     )
  //   )
  // )
指定した名前のアノテーションのみ取得したい場合は getAnnotation("name") メソッドを使用してください。
/**
 * @hoge a b
 */
class MyClass
{
  
}

$ref = new Sabel_Reflection_Class("MyClass");
$classAnnotation = $ref->getAnnotation("hoge");

var_dump($classAnnotation);
  // array (
  //   [0] =>
  //   array (
  //     [0] => "a"
  //     [1] => "b"
  //   )
  // )
なお、リフレクションオブジェクトは Sabel_Object を継承しているクラスであれば getReflection() メソッドで取得することができます。
class MyClass extends Sabel_Object
{
  
}

$myClass = new MyClass();
$reflection = $myClass->getReflection();