Doxygen: как описать переменные-члены класса в php?
Я пытаюсь использовать doxygen для разбора php-кода в xml-выход.
Doxygen не анализирует описание переменных-членов класса.
Вот мой пример файла php:
<?php
class A
{
/**
* Id on page.
*
* @var integer
*/
var $id = 1;
}
?>
Обратите внимание, что комментарий имеет краткое описание и тип переменной.
Вот xml, который я получил из этого источника:
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.7.2">
<compounddef id="class_a" kind="class" prot="public">
<compoundname>A</compoundname>
<sectiondef kind="public-attrib">
<memberdef kind="variable" id="class_a_1ae97941710d863131c700f069b109991e" prot="public" static="no" mutable="no">
<type></type>
<definition>$id</definition>
<argsstring></argsstring>
<name>$id</name>
<initializer> 1</initializer>
<briefdescription>
</briefdescription>
<detaileddescription>
</detaileddescription>
<inbodydescription>
</inbodydescription>
<location file="C:/projects/version6-7/asprunner/PHP/source/classes/a.php" line="11" bodyfile="C:/projects/version6-7/asprunner/PHP/source/classes/a.php" bodystart="11" bodyend="-1"/>
</memberdef>
</sectiondef>
<briefdescription>
</briefdescription>
<detaileddescription>
</detaileddescription>
<location file="C:/projects/version6-7/asprunner/PHP/source/classes/a.php" line="5" bodyfile="C:/projects/version6-7/asprunner/PHP/source/classes/a.php" bodystart="4" bodyend="12"/>
<listofallmembers>
<member refid="class_a_1ae97941710d863131c700f069b109991e" prot="public" virt="non-virtual"><scope>A</scope><name>$id</name></member>
</listofallmembers>
</compounddef>
</doxygen>
Ни одно описание или тип не были проанализированы.
Как я могу это исправить?
Ответы
Ответ 1
Я использую входной фильтр, чтобы вставлять шрифты из аннотации @var inline с объявлением переменной и удалять аннотацию @var, поскольку она имеет другое значение в Doxygen. Для получения дополнительной информации см. Ошибку # 626105.
Поскольку Doxygen использует C-подобный парсер, когда входной фильтр запущен, он может распознавать типы.
<?php
$source = file_get_contents($argv[1]);
$regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
$replac = '${2} */ ${3} ${1} ${4}';
$source = preg_replace($regexp, $replac, $source);
echo $source;
Это быстрый хак, и, вероятно, есть ошибки, он просто работает для моего кода:
![Doxygen @var PHP]()
Вы можете включить фильтр ввода с параметром INPUT_FILTER в вашем Doxyfile. Сохраните приведенный выше код в файл с именем php_var_filter.php и установите значение фильтра в "php php_var_filter.php".
Ответ 2
У меня была такая же проблема, поэтому я создал простой входной фильтр, который превращает основной синтаксис
/**
* @var int
*/
public $id;
в
/**
* @var int $id
*/
public $id;
что было бы лишним. Таким образом, Eclipse IDE может использовать тот же док-блок, что и Doxygen.
Вы можете загрузить входной фильтр отсюда:
https://bitbucket.org/tamasimrei/misc-tools/src/master/doxygen/filter.php
Обратитесь к Doxygen Manual о том, как использовать входной фильтр.
Инструмент также избегает обратных косых черт в докблоках, поэтому вы можете использовать там пространства имен.
Ответ 3
Кажется, это ошибка в Doxygen. У меня такая же проблема с документацией в HTML.
В настоящее время работает:
class A
{
var $id = 1; /**< Id on page. */
}
Но эти комментарии не распознаются IDE NetBeans как документация поля.
Ответ 4
Хотя это не прямой ответ на ваш вопрос: если вы свободны использовать правильный инструмент для работы, посмотрите DocBlox. Он также генерирует XML-документ для дальнейшего преобразования в HTML или любой другой формат отображения и отлично работает для PHP. Он также не нарушит ваше обычное использование докблока.
В качестве примера выведите описание документации по API Zend Framework.
Ответ 5
Блок будет правильно связан, если вы опустите @var. Это ничего не дает, чтобы объявить тип, который раздражает, но, по крайней мере, описание будет работать.
Версия для тестирования: Doxygen 1.7.1
Ответ 6
Большое спасибо Горану за его кислородный фильтр! Несколько расширив ту же идею, чтобы правильно документировать параметры функции:
Включить Zend Studio-style-array-of-objects @param-типы в документацию doxygen:
// Change the following:
// /** @param VarType[] $pParamName Description **/
// function name(array $pParamName) {
// Into:
// /** @param array $pParamName Description **/
// function name(VarType[] $pParamName) {
$regexp = '#\@param\s+([^\s]+)\[\]\s+(\$[^\s]+)\s+([^/]+)/\s+(public|protected|private)?\s+function\s+([^\s]+)\s*\(([^)]*)array\s+\2([^)]*)\)(\s+){#s';
$replac = '@param array ${2} ${3}/ ${4} function ${5} (${6} ${1}[] ${2}${7})${8}{';
$lSource = preg_replace($regexp, $replac, $lSource);
Включить типы int/float/double/string @param в документацию doxygen:
// Change the following:
// /** @param (int|float|double|string) $pParamName Description **/
// function name($pParamName) {
// Into:
// /** @param (int|float|double|string) $pParamName Description **/
// function name((int|float|double|string) $pParamName) {
$regexp = '#\@param\s+(int|float|double|string)\s+(\$[^\s]+)\s+([^/]+)/\s+(public|protected|private)?\s+function\s+([^\(\s]+)\s*([^)]*)(\(|,)\s*\2([^)]*)\)(\s+){#s';
$replac = '@param ${1} ${2} ${3}/ ${4} function ${5}${6}${7}${1} ${2}${8})${9}{ '; //${6}${1} ${2}${7})${8}{';
$lSource = preg_replace($regexp, $replac, $lSource);
Оба вышеупомянутых регулярных выражения также, естественно, работают с функциями, принимающими более одного аргумента. Также просто быстрый хак, который работает для нашего кода, надеюсь, что это поможет кому-то другому.
Ответ 7
Для пользователей Windows без установленного php может быть полезно использовать скомпилированный исполняемый php_var_filter.php фильтр doxygen script из ответ