#php #reflection #comments #phpdoc
#php #отражение #Комментарии #phpdoc
Вопрос:
Я недавно познакомился с Reflection
и экспериментировал с ним, особенно getDocComment()
, однако, похоже, что он поддерживает только /** */
блоки комментариев.
/** foobar */
class MyClass{}
$refl = new ReflectionClass('MyClass');
// produces /** foobar */
echo $refl->getDocComment();
-Против-
# 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(amp;$token){
return (($token[0] == T_COMMENT) amp;amp; ($token = strstr($token[1], '#')));
});
print_r($annotations);
Выводит:
Array
(
[4] => #[annotation]
[8] => #[another annotation]
)
Комментарии:
1. Что касается моей правки; это все еще неосуществимо. Microtime протестировал его в
Zend_Controller_Front
файле класса ( 1007 строк, 3497 токенов ), и это занимает0.010729945898056
в среднем ( 1000 итераций в моем личном кабинете разработчика )2. вы правильно поняли? было интересно, нашли ли вы лучший способ.
3. @dader Нет, прямой текстовый анализ данного файла может повысить производительность, но тогда вам нужно разобраться в результатах.
4. хорошо, я бы предложил это, это может быть или не быть осуществимым. Используя анализатор рекурсивного спуска, вы могли бы написать простую грамматику, которая должна различать только «смешанный» код (в конечном счете, вплоть до описания класса / метода или инструкции) и комментарии. Поскольку вы не ищете исчерпывающее дерево синтаксического анализа, грамматика останется простой. Тогда у вас будет список токенов, который имеет смысл. Конечно, он по-прежнему использует беспорядочный подход file_get_contents ( FILE )… Но я не могу избавиться от этого, поскольку все здесь основано на исходном коде, а не на логической структуре PHP.
Ответ №1:
DocComments отличаются тем, что говорят что-то о том, как должны использоваться ваши классы, по сравнению с обычными комментариями, которые могли бы помочь разработчику в чтении кода. Именно поэтому вместо этого не вызывается метод getComment()
.
Конечно, это все синтаксический анализ текста, и кто-то только что сделал выбор в docComments, которые всегда являются многострочными комментариями, но этот выбор, по-видимому, был сделан, и чтение обычных комментариев не относится к категории отражения.
Комментарии:
1. Спасибо C.Evenhuis ; Что ж, это прискорбно. Мне было любопытно, потому что в моем чтении я слышал о поддерживающей его платформе PHP XP , но, покопавшись, я узнал, что они реализовали свои собственные классы отражения, которые, предположительно, добавляют поддержку для этого. docs.xp-framework.net/xml/doc?core/reflection
Ответ №2:
Несколько дней назад я пытался сделать просто you, и вот мой трюк. Вы можете просто использовать внутренний токенизатор 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
Надеюсь, это поможет!
Комментарии:
1. Спасибо dader51 ; Это здорово, за исключением того, что он использует беспорядочный
file_get_contents(__FILE__)
подход для саморефлексии, и было бы трудно связать данный комментарий с определением (класс, функция и т.д.)2. Да, я знаю проблему file_get_contents, более того, использование токенизатора для этой цели приведет вас к области синтаксического анализа, которая на самом деле представляет собой целую страну…
3. Это просто сделало мой день лучше! Спасибо @dader!
Ответ №3:
AFAIK, чтобы комментарий стал документацией, он должен начинаться с /** даже не со стандартного многострочного комментария.
Ответ №4:
Комментарий doc, как следует из названия, является комментарием к документации, а не стандартным комментарием, в противном случае, когда вы собираете комментарии для таких приложений, как doxygen, Он попытается задокументировать любой прокомментированный код из testing / debuggung и т.д., Который часто остается позади и не важен для пользователя API.
Ответ №5:
Как вы можете прочитать здесь в первой заметке, внесенной пользователем:
Комментарий к документу (
T_DOC_COMMENT
) должен начинаться с/**
— это две звездочки, а не одна. Комментарий продолжается до первого*/
. Обычный многострочный комментарий/*...*/
(T_COMMENT
) не считается комментарием к документу.
Таким образом, только /** */
блоки выдаются этим методом.
Я не знаю никакого другого метода с php для получения других комментариев с помощью file_get_contents
и фильтрации комментариев, например, с помощью regex
Комментарии:
1. Спасибо Весселю Краненборгу ; Черт возьми. Я видел, что это упоминалось в другом месте, я просто не знал, была ли не упомянутая поддержка комментариев, не содержащих документ-блок. PHP должен консолидировать комментарии пользователей к методам класса, когда комментарии касаются расширенного метода, поскольку
getDocComment
появляется 3 раза. Я понимаю, что это контекст, но все же.