我正在尝试使用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>
未解析任何描述或类型。 我该如何解决这个问题?
答案 0 :(得分:12)
我正在使用输入过滤器从@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;
这是quick hack,可能有错误,它只适用于我的代码:
您可以在Doxyfile中启用带INPUT_FILTER选项的输入过滤器。将上面的代码保存到名为php_var_filter.php的文件中,并将过滤器值设置为“php php_var_filter.php”。
答案 1 :(得分:2)
我遇到了同样的问题,所以我创建了一个简单的输入过滤器来转换
的基本语法/**
* @var int
*/
public $id;
到
/**
* @var int $id
*/
public $id;
无论如何都是多余的。这样Eclipse IDE就可以使用与doxygen相同的docblock。
您可以从此处下载输入过滤器:
https://bitbucket.org/tamasimrei/misc-tools/src/master/doxygen/filter.php
有关如何使用输入过滤器的信息,请参阅doxygen Manual。
该工具还会转义docblocks中的反斜杠,因此您可以在那里使用命名空间。
答案 2 :(得分:1)
似乎是Doxygen中的一个错误。我对HTML中的文档也存在同样的问题。
目前有效的是:
class A
{
var $id = 1; /**< Id on page. */
}
但NetBeans IDE无法将这些注释视为字段文档。
答案 3 :(得分:1)
虽然这不是您问题的直接答案:如果您可以自由使用正确的工具,请查看DocBlox。它还生成一个XML文档,用于进一步转换为HTML或任何其他显示格式,并且非常适合PHP。它也不会打破你常用的docblock用法。
作为示例输出,请查看Zend Framework API documentation。
答案 4 :(得分:1)
如果省略@var,则块将正确关联。这并没有给任何地方声明类型,这很烦人,但至少描述会起作用。
测试版:Doxygen 1.7.1
答案 5 :(得分:0)
非常感谢Goran的doxygen过滤器!稍微扩展相同的想法,以便正确记录函数参数:
在doxygen文档中包含Zend Studio样式的对象数组@param类型:
// 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);
在doxygen文档中包含int / float / double / string @param类型:
// 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);
上述两个正则表达式自然也适用于具有多个参数的函数。也只是一个快速的黑客,适用于我们的代码,希望它可以帮助其他人。
答案 6 :(得分:0)
对于没有安装php的Windows用户,可以使用compiled to executable php_var_filter.php doxygen filter script
中的answer