代码之家  ›  专栏  ›  技术社区  ›  georg

doxygen忽略封装在语句中的类

  •  -3
  • georg  · 技术社区  · 10 年前

    我在php代码中使用doxygen。我的一些类以类似于以下的方式封装在if语句中:

    if(!class_exists('FooBar', false)) {
    
        /**
         * Docs
         **/
        class FooBar
        {
    
        }
    }
    

    doxygen似乎不明白这一点,并忽略了 class FooBar 彻底地是否有解决方法?

    修补doxygen是没有问题的,请随时提出建议(我想在 scanner.l )

    4 回复  |  直到 10 年前
        1
  •  4
  •   hakre    10 年前

    Doxygen不会用它的静态分析来解释代码,因此if子句只是代码,而类定义没有用于文档(这也是有意义的,因为它只是有条件的,很可能不需要)。

    将类定义外部化,这样静态代码分析就不会有问题。这样,也可以很容易地要求此类定义。它还与自动加载兼容(本答案中未记录),Doxygen对此没有任何问题。

    ...
    
    if (!class_exists('Myfile', false))
    {
        require(__DIR__ . '/Myfile.php');
    }
    
    ...
    

    我的文件.php

    <?php
    class Myfile
    {
        ...
    }
    
        2
  •  2
  •   Cheeseminer    10 年前

    由于我不会说PHP,我将提供一个可能的与Doxygen相关的答案:

    尝试用 \cond 对doxygen隐藏代码的命令。

    /** \cond */
    if(!class_exists('FooBar', false)) {
    /** \endcond */
    
        /**
         * Docs
         **/
        class FooBar
        {
    
        }
    
    /** \cond */
    }
    /** \endcond */
    

    我不确定这是否可行-这取决于Doxygen的解析顺序-但在您开始打开修改Doxygen将带来的复杂性之前,似乎值得一试。

        3
  •  1
  •   AbcAeffchen    8 年前

    您也可以使用此筛选器(复制自 GitHub ):

    <?php
    
    // Get the input
    $source = file_get_contents($argv[1]);
    // removes the whole line
    list($head,$tail) = preg_split('/.*if\(!class_exists\(.+/', $source, 2);
    $openingBracePos = strpos($tail,'{');
    $closingBracePos = strrpos($tail,'}');
    if($openingBracePos !== false && $closingBracePos !== false)
        $source = $head . substr($tail,$openingBracePos+1,
                                 $closingBracePos-$openingBracePos-1);
    // Output
    echo $source;
    

    此筛选器将删除 if(!class_exists(...)) 语句,所以doxygen理解代码,而不改变代码本身。

        4
  •  0
  •   Pian0_M4n    10 年前

    删除 false .会奏效的