PHP отражение; извлечение неблокированных комментариев - PullRequest
1 голос
/ 11 июня 2011

Я недавно познакомился с Reflection и экспериментировал с ним, особенно с getDocComment(), однако, похоже, он поддерживает только /** */ блоки комментариев.

/** foobar */
class MyClass{}

$refl = new ReflectionClass('MyClass');

// produces /** foobar */
echo $refl->getDocComment();

-Versus-

# foobar
class MyClass{}

$refl = new ReflectionClass('MyClass');

// produces nothing
echo $refl->getDocComment();

Разве невозможно уловить это, не прибегая к какой-либо ерунде file_get_contents(__FILE__)?


Согласно ответу dader51 , я полагаю, что мой лучший подход будет выглядеть примерно так:

// random comment

#[annotation]

/**
 * another comment with a # hash
 */

#[another annotation]

$annotations
    = array_filter(token_get_all(file_get_contents(__FILE__)), function(&$token){
    return (($token[0] == T_COMMENT) && ($token = strstr($token[1], '#')));
});

print_r($annotations);

Выходы:

Array
(
    [4] => #[annotation]

    [8] => #[another annotation]

)

Ответы [ 5 ]

5 голосов
/ 11 июня 2011

DocComments отличаются тем, что рассказывают о том, как будут использоваться ваши классы, по сравнению с обычными комментариями, которые могут помочь разработчику в чтении кода.Вот почему метод не называется getComment().

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

4 голосов
/ 11 июня 2011

Я пытался сделать всего несколько дней назад, и вот мой трюк. Вы можете просто использовать внутренний токенизер php (http://www.php.net/manual/en/function.token-get-all.php), а затем пройтись по возвращенному массиву, чтобы выбрать только комментарии, вот пример кода:

$a = token_get_all(file_get_contents('path/to/your/file.php'));
print_r($a); // display an array of all tokens found in the file file.php

Вот список всех токенов, которые распознает php: http://www.php.net/manual/en/tokens.php

И комментарий, который вы получите этим способом, включает (с сайта php.net):

T_COMMENT: // или #, и / * * / в PHP 5

Надеюсь, это поможет!

2 голосов
/ 11 июня 2011

Комментарий документа, как следует из названия, является комментарием к документации, а не стандартным комментарием, в противном случае, когда вы получаете комментарии для приложений, таких как doxygen, он попытается документировать любой закомментированный код из тестирования / отладки и т. Д.оставлен позади и не важен для пользователя API.

2 голосов
/ 11 июня 2011

Как вы можете прочитать здесь в первом примечании пользователя:

Комментарий к документу (T_DOC_COMMENT) должен начинаться с /** - это две звездочки, а не одна. Комментарий продолжается до первого */. Обычный многострочный комментарий /*...*/ (T_COMMENT) не считается комментарием к документу.

Таким образом, только /** */ блоки задаются этим методом.

Я не знаю другого метода с php, чтобы получить другие комментарии, например file_get_contents, и отфильтровать комментарии, например, с помощью. regex

2 голосов
/ 11 июня 2011

AFAIK, чтобы комментарий стал документацией, нужно начинать с / ** даже не со стандартного многострочного комментария.

...