Анализ комментариев PHP Doc в структуру данных

Я использую Reflection API в PHP, чтобы вытащить строку DocComment (PHPDoc) из метода

$r = new ReflectionMethod($object); $comment = $r->getDocComment(); 

Это вернет строку, которая выглядит примерно так (в зависимости от того, насколько хорошо документирован метод)

 /** * Does this great things * * @param string $thing * @return Some_Great_Thing */ 

Существуют ли встроенные методы или функции, которые могут анализировать строку комментариев PHP Doc Comment в структуру данных?

 $object = some_magic_function_or_method($comment_string); echo 'Returns a: ', $object->return; 

Не имея этого, какую часть исходного кода PHPDoc я должен смотреть на это сам.

Отсутствие и / или в дополнение к этому, есть ли сторонний код, который считается «лучше» на этом, чем код PHPDoc?

Я понимаю, что синтаксический анализ этих строк – это не наука о ракетах или даже компьютерная наука, но я бы предпочел хорошо протестированную библиотеку / рутину / метод, который был построен для обработки большого количества неуловимого, полунеправильного кода PHP Doc, который может существовать в дикой природе.

Я удивлен, что это еще не упоминалось: как насчет использования Zend_Reflection Zend Framework? Это может пригодиться, особенно если вы работаете с программным обеспечением, основанным на Zend Framework, например Magento.

См. Руководство по Zend Framework для некоторых примеров кода и документации API для доступных методов.

Существуют разные способы сделать это:

  • Передайте имя файла Zend_Reflection_File.
  • Передайте объект Zend_Reflection_Class.
  • Передайте объект и имя метода в Zend_Reflection_Method.
  • Если у вас действительно есть только строка комментариев, вы даже можете скомпоновать код для небольшого класса фиктивного типа, сохраните его во временном файле и передайте этот файл Zend_Reflection_File.

Давайте рассмотрим простой случай и предположим, что у вас есть существующий класс, который вы хотите проверить.

Код был бы таким (непроверенный, пожалуйста, простите меня):

 $method = new Zend_Reflection_Method($class, 'yourMethod'); $docblock = $method->getDocBlock(); if ($docBlock->hasTag('return')) { $tagReturn = $docBlock->getTag('return'); // $tagReturn is an instance of Zend_Reflection_Docblock_Tag_Return echo "Returns a: " . $tagReturn->getType() . "<br>"; echo "Comment for return type: " . $tagReturn->getDescription(); } 

Вы можете использовать класс « DocBlockParser » из проекта Fabien Potencier Sami («Еще один генератор документации PHP API») с открытым исходным кодом.
Прежде всего, возьмите саам из GitHub .
Это пример того, как его использовать:

 <?php require_once 'Sami/Parser/DocBlockParser.php'; require_once 'Sami/Parser/Node/DocBlockNode.php'; class TestClass { /** * This is the short description. * * This is the 1st line of the long description * This is the 2nd line of the long description * This is the 3rd line of the long description * * @param bool|string $foo sometimes a boolean, sometimes a string (or, could have just used "mixed") * @param bool|int $bar sometimes a boolean, sometimes an int (again, could have just used "mixed") * @return string de-html_entitied string (no entities at all) */ public function another_test($foo, $bar) { return strtr($foo,array_flip(get_html_translation_table(HTML_ENTITIES))); } } use Sami\Parser\DocBlockParser; use Sami\Parser\Node\DocBlockNode; try { $method = new ReflectionMethod('TestClass', 'another_test'); $comment = $method->getDocComment(); if ($comment !== FALSE) { $dbp = new DocBlockParser(); $doc = $dbp->parse($comment); echo "\n** getDesc:\n"; print_r($doc->getDesc()); echo "\n** getTags:\n"; print_r($doc->getTags()); echo "\n** getTag('param'):\n"; print_r($doc->getTag('param')); echo "\n** getErrors:\n"; print_r($doc->getErrors()); echo "\n** getOtherTags:\n"; print_r($doc->getOtherTags()); echo "\n** getShortDesc:\n"; print_r($doc->getShortDesc()); echo "\n** getLongDesc:\n"; print_r($doc->getLongDesc()); } } catch (Exception $e) { print_r($e); } ?> 

И вот результат тестовой страницы:

 ** getDesc: This is the short description. This is the 1st line of the long description This is the 2nd line of the long description This is the 3rd line of the long description ** getTags: Array ( [param] => Array ( [0] => Array ( [0] => Array ( [0] => Array ( [0] => bool [1] => ) [1] => Array ( [0] => string [1] => ) ) [1] => foo [2] => sometimes a boolean, sometimes a string (or, could have just used "mixed") ) [1] => Array ( [0] => Array ( [0] => Array ( [0] => bool [1] => ) [1] => Array ( [0] => int [1] => ) ) [1] => bar [2] => sometimes a boolean, sometimes an int (again, could have just used "mixed") ) ) [return] => Array ( [0] => Array ( [0] => Array ( [0] => Array ( [0] => string [1] => ) ) [1] => de-html_entitied string (no entities at all) ) ) ) ** getTag('param'): Array ( [0] => Array ( [0] => Array ( [0] => Array ( [0] => bool [1] => ) [1] => Array ( [0] => string [1] => ) ) [1] => foo [2] => sometimes a boolean, sometimes a string (or, could have just used "mixed") ) [1] => Array ( [0] => Array ( [0] => Array ( [0] => bool [1] => ) [1] => Array ( [0] => int [1] => ) ) [1] => bar [2] => sometimes a boolean, sometimes an int (again, could have just used "mixed") ) ) ** getErrors: Array ( ) ** getOtherTags: Array ( ) ** getShortDesc: This is the short description. ** getLongDesc: This is the 1st line of the long description This is the 2nd line of the long description This is the 3rd line of the long description 

Вы можете использовать DocBlox ( http://github.com/mvriel/docblox ) для создания структуры данных XML для вас; вы можете установить DocBlox с помощью PEAR, а затем запустить команду:

 docblox parse -d [FOLDER] -t [TARGET_LOCATION] 

Это создаст файл с именем structure.xml который содержит все метаданные о вашем исходном коде, включая проанализированные докблоки.

ИЛИ

Вы можете использовать классы DocBlox_Reflection_DocBlock * для прямого анализа фрагмента текста DocBlock.

Это можно сделать, если вы включили автозагрузку (или включили все файлы DocBlox_Reflection_DocBlock *) и выполните следующие действия:

 $parsed = new DocBlox_Reflection_DocBlock($docblock); 

Впоследствии вы можете использовать геттеры для извлечения необходимой информации.

Примечание: вам не нужно удалять звездочки; класс Reflection позаботится об этом.

Проверять, выписываться

http://pecl.php.net/package/docblock

Думаю, функция docblock_tokenize () поможет вам в этом.

Я предлагаю добавление, его довольно классный и хорошо живой и используемый во многих фреймворках php5 …

http://code.google.com/p/addendum/

Проверьте примеры тестов

http://code.google.com/p/addendum/source/browse/trunk#trunk%2Fannotations%2Ftests

Вы всегда можете просмотреть источник из phpDoc . Код находится под LGPL, поэтому, если вы решите его скопировать, вам нужно будет лицензировать свое программное обеспечение под одной лицензией и правильно добавить правильные уведомления.

EDIT: Если, как @Samuel Herzog, если вы используете его как библиотеку.

Спасибо @Samuel Herzog за разъяснение.

Из вашего описания я могу только подозревать, что вы пытаетесь сделать (документация по PHP-коду). Поскольку вы не указываете, почему вы пытаетесь это сделать, я могу только догадываться.

Возможно, вам стоит попробовать другой подход. Чтобы документировать PHP-код (если это то, что вы пытаетесь), я бы использовал Doxygen и внешний вид вашего комментария кода, он уже отформатирован для doxygen.

С помощью Graphviz Doxygen также отображает красивые диаграммы классов и вызывает деревья.

Если вы пытаетесь прочитать в тегах @ и их значениях, то наилучшим решением будет использование preg_match.

Я предлагаю вам ознакомиться с http://code.google.com/p/php-annotations/

Код достаточно прост для изменения / понимания при необходимости.

Как указано в одном из приведенных выше ответов, вы можете использовать phpDocumentor. Если вы используете композитор, просто добавьте «phpdocumentor / reflection-docblock»: «~ 2.0» в блок «require».

См. Пример: https://github.com/abdulla16/decoupled-app/blob/master/composer.json

Примеры использования см. На странице https://github.com/abdulla16/decoupled-app/blob/master/Container/Container.php.