php - PHP 文档中的 Doxygen 和 "self"关键字

标签 php doxygen

我正在尝试使用 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 的用法。当然我不太喜欢这个解决方案。我该如何解决这个问题? 非常感谢

最佳答案

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”应定义为小写。

关于php - PHP 文档中的 Doxygen 和 "self"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43340402/

相关文章:

doxygen - 如何在我的doxygen文档中添加外部资源(pdf文件)

python - Emacs 中对 Python 的 Doxygen 支持?

c - 头文件中没有定义的 Doxygen C 结构声明

javascript - 当函数定时器到达 00 时刷新 div :00

php - 来自动态链接的推文

javascript - 想要 PHP 和 JS 表单(空字段/密码匹配)验证吗?

c++ - 记录谷歌测试

php - Symfony2 MongoDB 多连接错误

php - 使用 SPL ArrayObject、ArrayIterator、RecursiveArrayIterator 而不是常规数组有什么好处?

variables - 将静态变量的初始值的 doxygen 复制到\file block