2012-03-16 2 views
18

Я хотел бы иметь возможность реализовать пользовательские аннотации в моих PHP5-объектах, и я хотел бы узнать, как весь процесс работает, создавая собственный парсер.Как найти аннотации в объекте PHP5?

Чтобы начать, мне нужно знать, как узнать аннотации.

Есть ли способ отражения, который мне не хватает, или есть другой способ?

Например, я хотел бы быть в состоянии найти следующую аннотацию в классе:

/** 
* @MyParam: myvalue 
*/ 
+0

Возможный дубликат http://stackoverflow.com/search?q=annotation+parser+php – Gordon

+1

Почему бы не использовать библиотеку, такую ​​как аннотации доктрины? – leyou

ответ

41

Вы можете сделать это с помощью ReflectionClass::getDocComment, например:

function getClassAnnotations($class) 
{  
    $r = new ReflectionClass($class); 
    $doc = $r->getDocComment(); 
    preg_match_all('#@(.*?)\n#s', $doc, $annotations); 
    return $annotations[1]; 
} 

Живая демонстрация: http://codepad.viper-7.com/u8bFT4

+0

Если в файле несколько комментариев, будет ли он их захватывать? – johnnietheblack

+0

'-> getDocComment()' просто получает комментарий doc, связанный с объектом, который вы просматриваете (комментарий docblock, непосредственно предшествующий объявлению этой вещи). Вы также можете получить комментарии к объектам, классам, методам, функциям и свойствам. – MightyE

+2

@johnnietheblack вы можете использовать http://php.net/manual/pl/class.reflectionmethod.php - для захвата комментария только для указанного метода. – Slawek

8

Вы можете получить блок комментариев с помощью метода объекта getDocComment Reflection.

Если вы не хотите, чтобы получить аннотацию вручную, вы можете использовать Zend Framework Reflection или другие существующие решения

+0

['doctrine/annotations'] (https://github.com/doctrine/annotations) является наиболее популярным – DanFromGermany