我正在尝试使用doxygen来记录我的PHP库,但我无法使用关键字“self”来配置它以识别我的类的成员函数的正确用法。例如,以下代码:
Class myclass{
public static function myfunc1(){
return 10; }
public static function myfunc2(){
return self::myfunc1(); }
}
未正确记录。 Doxygen映射两个函数,但是当它引用对这些函数的内部或外部调用时,它不会考虑myfunc2调用的myfunc1。
我目前的解决方法是更改代码如下:
Class myclass{
public static function myfunc1(){
return 10; }
public static function myfunc2(){
return myclass::myfunc1(); }
}
在这种情况下,doxygen正确指出与myfunc2相关的myfunc1的用法。当然,我不太喜欢这个解决方案。我该如何解决这个问题? 非常感谢你
答案 0 :(得分:2)
Doxygen提供了输入过滤选项,使我们能够在创建文档时更改源代码。对于例如它使我们能够拦截代码并在飞行中将代码self::myfunc1
更改为myclass::myfunc1
,这是Doxygen所理解的。它不会以任何方式更改实际的源代码。
我已根据Doxygen PHP Filters的代码创建了一个过滤器,并进行了一些修改,可以为您进行更改。
请创建一个文件/path/to/selfFilter.php并将代码放入其中:
<?php
//Create file /path/to/selfFilter.php
$source = file_get_contents($argv[1]);
$tokens = token_get_all($source);
$classes = array();
foreach($tokens as $key => $token)
{
if($token[0] == T_CLASS)
$classes[] = $tokens[$key+2][1];
}
if(!empty($classes))
{
list($source, $tail) = explode('class ' . $classes[0], $source, 2);
$class_code = '';
for($i = 1; $i < count($classes); $i++)
{
list($class_code, $tail) = explode('class ' . $classes[$i], $tail, 2);
$class_code = preg_replace('#\bself::#', $classes[$i-1].'::', $class_code);
$source .= 'class ' . $classes[$i-1] . $class_code;
}
$class_code = preg_replace('#\bself::#', $classes[count($classes)-1].'::', $tail);
$source .= 'class ' . $classes[count($classes)-1] . $class_code;
}
echo $source;
更新doxygen配置文件中的以下选项。
INPUT_FILTER = "php /path/to/selfFilter.php"
FILTER_PATTERNS =
FILTER_SOURCE_FILES = YES
FILTER_SOURCE_PATTERNS =
请确保/path/to/selfFilter.php
是可执行的并且路径上有php可用,否则请使用完整的php路径
INPUT_FILTER = /usr/bin/php /path/to/selfFilter.php
如果你现在运行Doxygen它应该工作。如果您有任何问题,请告诉我。
注意:关键字“class”应以小写字母定义,以便上述过滤器正常工作。