Разбор комментариев PHP Doc в структуру данных - PullRequest
25 голосов
/ 16 января 2011

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

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

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

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

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

$object = some_magic_function_or_method($comment_string);

echo 'Returns a: ', $object->return;

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

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

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

Ответы [ 12 ]

1 голос
/ 23 апреля 2018

Обновленная версия кода пользователя 1419445. Метод DocBlockParser::parse() изменен и нуждается во втором параметре контекста. Кажется, что он также немного связан с phpDocumentor, поэтому для простоты я бы предположил, что вы установили Sami через Composer. Код ниже работает для Sami v4.0.16

<?php

require_once 'vendor/autoload.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\Filter\PublicFilter;
use Sami\Parser\ParserContext;

try {
    $method = new ReflectionMethod('TestClass', 'another_test');
    $comment = $method->getDocComment();
    if ($comment !== FALSE) {
        $dbp = new DocBlockParser();
        $filter = new PublicFilter;
        $context = new ParserContext($filter, $dbp, NULL);
        $doc = $dbp->parse($comment, $context);
        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);
}

?>
1 голос
/ 26 ноября 2014

Как указано в одном из ответов выше, вы можете использовать phpDocumentor. Если вы используете композитор, то просто добавьте "phpdocumentor / mirror-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

...