Doxygen: как описать переменные члена класса в php? - PullRequest
15 голосов
/ 01 декабря 2010

Я пытаюсь использовать 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>

Ни описание, ни тип не были проанализированы.Как я могу это исправить?

Ответы [ 7 ]

12 голосов
/ 12 декабря 2011

Я использую входной фильтр для вставки шрифтов из аннотации @var, встроенной в объявление переменной, и удаляю аннотацию @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;

Thisэто быстрый взлом , и, возможно, с ошибками, он просто работает для моего кода:

Doxygen @var PHP

Вы можете включить фильтр ввода с помощью INPUT_FILTER опция в вашем Doxyfile.Сохраните приведенный выше код в файл с именем php_var_filter.php и установите значение фильтра «php php_var_filter.php».

2 голосов
/ 30 марта 2012

У меня была такая же проблема, поэтому я создал простой фильтр ввода, который превращает базовый синтаксис

/**
 * @var int
 */
public $id;

в

/**
 * @var int $id
 */
public $id;

, который в любом случае будет избыточным.Таким образом, Eclipse IDE может использовать тот же самый докблок, что и doxygen.

Вы можете скачать входной фильтр здесь:

https://bitbucket.org/tamasimrei/misc-tools/src/master/doxygen/filter.php

См. Руководство по Doxygen о том, как использовать входной фильтр.

Инструмент также избегает обратной косой черты в docblocks, так что вы можете использовать там пространства имен.

1 голос
/ 19 августа 2011

Блок будет правильно связан, если вы пропустите @var.Это никуда не дает объявить тип, что раздражает, но по крайней мере описание будет работать.

1 голос
/ 18 августа 2011

Хотя это не является прямым ответом на ваш вопрос: если вы можете использовать правильный инструмент для работы, взгляните на DocBlox . Он также генерирует XML-документ для дальнейшего преобразования в HTML или любой другой формат отображения и работает очень хорошо для PHP. Это также не нарушит вашего обычного использования docblock.

В качестве примера выходных данных ознакомьтесь с документацией Zend Framework API .

1 голос
/ 17 февраля 2011

Кажется, это ошибка в Doxygen. У меня та же проблема с документацией в HTML.

На данный момент работает:

class A
{
    var $id = 1; /**< Id on page. */
}

Но эти комментарии не распознаются средой IDE NetBeans как документация поля.

0 голосов
/ 08 июня 2013

Для пользователей Windows без установленного php может быть полезно скомпилировано в исполняемый скрипт php_var_filter.php сценарий фильтра кислорода из ответ

0 голосов
/ 14 февраля 2013

Большое спасибо Горану за его кислородный фильтр!Немного расширив ту же идею, для правильного документирования параметров функций:

Включение типов массива объектов в стиле Zend Studio @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);

Оба приведенных выше регулярных выражения также естественным образом работают с функциями, принимающими более одного аргумента.Также просто быстрый взлом, который работает для нашего кода, надеюсь, он поможет кому-то еще.

...