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();