提问人: 提问时间:12/21/2009 最后编辑:16 revsPekka 웃 更新时间:6/3/2014 访问量:6923
添加和完成PHP源代码文档的工具 [已关闭]
A tool to add and complete PHP source code documentation [closed]
问:
我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便用事实和引文来回答。
5年前关闭。
我有几个已完成的、较旧的 PHP 项目,其中包含很多内容,我想以 javadoc/phpDocumentor 风格记录它们。
虽然手动处理每个文件并被迫在文档的同时进行代码审查是最好的事情,但我只是出于时间限制,对帮助我尽可能自动化任务的工具感兴趣。
理想情况下,我正在考虑的工具将具有以下功能:
解析 PHP 项目树并告诉我哪里有未记录的文件、类和函数/方法(即缺少相应 docblock 注释的元素)
提供一种方法,通过创建空结构来轻松添加缺少的文档块,理想情况下,在编辑器(我不在乎内部或外部)中打开文件,这样我就可以输入描述。
自选:
- 自动识别参数类型、返回值等。但这并不是真正必需的。
有问题的语言是 PHP,尽管我可以想象 C/Java 工具在经过一些调整后可能能够处理 PHP 文件。
感谢您的大力投入!
答:
您可以使用 Code Sniffer for PHP 根据一组预定义的编码准则测试您的代码。它还将检查缺少的文档块并生成可用于识别文件的报告。
评论
我认为PHP_Codesniffer
可以指示何时没有文档块 - 请参阅此页面上的报告示例(引用其中之一):
--------------------------------------------------------------------------------
FOUND 5 ERROR(S) AND 1 WARNING(S) AFFECTING 5 LINE(S)
--------------------------------------------------------------------------------
2 | ERROR | Missing file doc comment
20 | ERROR | PHP keywords must be lowercase; expected "false" but found
| | "FALSE"
47 | ERROR | Line not indented correctly; expected 4 spaces but found 1
47 | WARNING | Equals sign not aligned with surrounding assignments
51 | ERROR | Missing function doc comment
88 | ERROR | Line not indented correctly; expected 9 spaces but found 6
--------------------------------------------------------------------------------
我想您可以使用PHP_Codesniffer至少获取没有文档的所有文件/类/方法的列表;据我所知,它可以生成XML作为输出,使用一些自动化工具更容易解析 - 这可能是一些docblock生成器的第一步;-)
另外,如果您使用 [phpDocumentor](http://www.phpdoc.org/) 生成文档,这个文档可以不报告丢失块的错误吗?
经过几次测试后,它可以 - 例如,在没有太多文档的类文件上运行它,使用以下选项:--undocumentedelements
phpdoc --filename MyClass.php --target doc --undocumentedelements
在输出的中间给出这个:
Reading file /home/squale/developpement/tests/temp/test-phpdoc/MyClass.php -- Parsing file
WARNING in MyClass.php on line 2: Class "MyClass" has no Class-level DocBlock.
WARNING in MyClass.php on line 2: no @package tag was used in a DocBlock for class MyClass
WARNING in MyClass.php on line 5: Method "__construct" has no method-level DocBlock.
WARNING in MyClass.php on line 16: File "/home/squale/developpement/tests/temp/test-phpdoc/MyClass.php" has no page-level DocBlock, use @package in the first DocBlock to create one
done
但是,在这里,即使它作为报告工具很有用,在生成缺失的文档块时也没有那么有用......
现在,我不知道有任何工具可以为您预先生成缺少的文档块:我通常在我的持续集成机制中使用PHP_Codesniffer和/或phpDocumentor,它报告缺少的文档块,然后,每个开发人员从他的IDE中添加缺少的内容......
...这工作得很好:通常每天丢失的文档块不超过几个,因此可以手动完成任务(并且 Eclipse PDT 提供了一个功能,可以在您编辑特定文件/方法时为方法预生成文档块)。
Appart,我真的不知道任何生成文档块的全自动工具......但我很确定我们可以设法创建一个有趣的工具,使用:
- 反射 API
token_get_all
解析 PHP 文件的源代码。
不过,经过一番搜索,我找到了这篇博文*(它是法语的——也许这里的一些人能够理解)*:[Ajout automatique de Tags phpDoc à l'aide de PHP_Beautifier](http://fxnion.free.fr/articles/phpdoc-tags-php-beautifier.php)。
*标题的可能翻译:“自动添加phpDoc标签,使用PHP_Beautifier”*
这个想法其实还不错:
PHP_Beautifier
工具非常漂亮且功能强大,当涉及到格式化一些格式不正确的PHP代码时- 我曾多次将它用于我什至无法阅读的代码^^
- 它可以使用所谓的“过滤器”进行扩展。
- 有关提供的筛选器列表,请参阅
PHP_Beautifier_Filter
- 有关提供的筛选器列表,请参阅
我链接到的博客文章中使用的想法是:
- 创建一个新的PHP_Beautifier筛选器,该筛选器将检测以下令牌:
T_CLASS
T_FUNCTION
T_INTERFACE
- 并在它们之前添加一个“草稿”文档块(如果还没有)
要在某些“MyClass.php”文件上运行该工具,我必须首先安装“PHP_Beautifier”:
pear install --alldeps Php_Beautifier-beta
然后,将过滤器下载到我正在使用的目录(当然,可以将其放在默认目录中):
wget http://fxnion.free.fr/downloads/phpDoc.filter.phpcs
cp phpDoc.filter.phpcs phpDoc.filter.php
在那之后,我创建了一个新脚本(再次基于我链接到的博客文章中提出的建议),它将:beautifier-1.php
- 加载我的文件内容
MyClass.php
- 实例化
PHP_Beautifier
- 添加一些过滤器来美化代码
- 添加我们刚刚下载的过滤器
phpDoc
- 美化我们文件的源,并将其回显到标准输出。
“美化者-1.php”脚本的代码将如下所示:
*(再一次,最大的部分是从博客文章中复制粘贴;我只翻译了评论,并更改了一些小内容)*
require_once 'PHP/Beautifier.php';
// Load the content of my source-file, with missing docblocks
$sourcecode = file_get_contents('MyClass.php');
$oToken = new PHP_Beautifier();
// The phpDoc.filter.php file is not in the default directory,
// but in the "current" one => we need to add it to the list of
// directories that PHP_Beautifier will search in for filters
$oToken->addFilterDirectory(dirname(__FILE__));
// Adding some nice filters, to format the code
$oToken->addFilter('ArrayNested');
$oToken->addFilter('Lowercase');
$oToken->addFilter('IndentStyles', array('style'=>'k&r'));
// Adding the phpDoc filter, asking it to add a license
// at the beginning of the file
$oToken->addFilter('phpDoc', array('license'=>'php'));
// The code is in $sourceCode
// We could also have used the setInputFile method,
// instead of having the code in a variable
$oToken->setInputString($sourcecode);
$oToken->process();
// And here we get the result, all clean !
echo $oToken->get();
请注意,我还必须在 中路径两件小事,以避免警告和通知......
相应的补丁可以在那里下载:http://extern.pascal-martin.fr/so/phpDoc.filter-pmn.patchphpDoc.filter.php
现在,如果我们运行那个“美化器-1.php”脚本:
$ php ./beautifier-1.php
对于初始包含以下代码的文件:MyClass.php
class MyClass {
public function __construct($myString, $myInt) {
//
}
/**
* Method with some comment
* @param array $params blah blah
*/
public function doSomething(array $params = array()) {
// ...
}
protected $_myVar;
}
这是我们得到的结果 -- 一旦我们的文件被美化了:
<?php
/**
*
* PHP version 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to [email protected] so we can mail you a copy immediately.
* @category PHP
* @package
* @subpackage Filter
* @author FirstName LastName <mail>
* @copyright 2009 FirstName LastName
* @link
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id:$
*/
/**
* @todo Description of class MyClass
* @author
* @version
* @package
* @subpackage
* @category
* @link
*/
class MyClass {
/**
* @todo Description of function __construct
* @param $myString
* @param $myInt
* @return
*/
public function __construct($myString, $myInt) {
//
}
/**
* Method with some comment
* @param array $params blah blah
*/
public function doSomething(array $params = array()) {
// ...
}
protected $_myVar;
}
我们可以注意到:
- 文件开头的许可证块
- 已添加到类中的文档块
MyClass
- 在方法上添加的文档块
__construct
- 上的文档块已经存在于我们的代码中:它没有被删除。
doSomething
- 有一些标签^^
@todo
当然,它并不完美:
- 它没有记录我们可能想要的所有东西
- 例如,在这里,它没有记录
protected $_myVar
- 例如,在这里,它没有记录
- 它不会增强现有的文档块
- 它不会在任何图形编辑器中打开文件
- 但那会更难,我想......
但我很确定这个想法可以用作更有趣的事情的起点:
- 关于没有被记录的东西:添加将被识别的新标签应该不会太难
- 您只需将它们添加到过滤器开头的列表中即可
- 我不得不承认,增强现有的文档块可能更难
- 一件好事是这可以是完全自动化的
- 使用 Eclipse PDT,也许可以将其设置为外部工具,因此我们至少可以从 IDE 启动它?
评论
php-tracer-weaver 可以检测代码并生成具有参数类型的文档块,通过运行时分析进行推导。
评论
phpDocumentor 的 1.4.x 版本具有 -ue 选项 (--undocumentedelements) [1],这将导致未记录的元素在文档运行期间生成的 errors.html 页面上列为警告。
此外,来自 PEAR PHP_DocBlockGenerator [2] 看起来可以为您生成缺失的文档块。
[2] -- http://pear.php.net/package/PHP_DocBlockGenerator
我们在工作中使用codesniffer来实现此功能,使用标准的PEAR或Zend标准。它不允许您即时编辑文件,但肯定会为您提供一个列表,其中包含缺少哪种文档块的行和描述。
HTH, JC公司
由于已经提到了 PHPCS,因此我加入了 Reflection API 来检查是否缺少 DocBlocks。下面链接的文章是关于如何处理问题的简短教程:
还有一个 PEAR 包PHP_DocBlockGenerator
,可以创建文件 Page 块和 DocBlocks,用于包含、全局变量、函数、参数、类、常量、属性和方法(以及其他东西)。
您想真正自动化填写“javadoc”类型数据的问题吗?
DMS 软件再造工具包可以配置为执行此操作。
它像编译器一样解析源文本,构建内部编译器结构,允许您实现任意分析,对这些结构进行修改,然后根据结构更改重新生成(“prettyprint”)源文本。它甚至保留了原始文本的注释和格式;您当然可以插入其他评论,它们会出现,这似乎是您的主要目标。DMS 对许多语言(包括 PHP)都这样做
你要做的是解析每个PHP文件,找到每个类/方法,生成应该是该实体的“javadoc”注释(类和方法的区别,对吧?),然后检查相应的注释是否真的存在于编译器结构中。如果没有,只需插入它们即可。Pretty打印最终结果。 由于它有权访问表示代码的编译器结构,因此按照您的建议生成参数并返回信息应该不难。当然,它不能做的是生成关于意图目的的评论;但它可能会生成一个占位符供您稍后填写。
不知道这是否有任何帮助,但如果 Codesniffer 可以指出函数/方法,那么一个像样的 PHP IDE(我提供 PHPEd)可以很容易地检查和搭建每个函数的 PHPDoc 注释。
只需在每个函数上方输入并按 ENTER,PHPEd 就会自动完成代码,并正确填写 、 、 等,为您的额外描述做好准备。这是我尝试的第一个示例,以便提供一个示例:/**
@param1
@param1
@return
/**
* put your comment here...
*
* @param mixed $url
* @param mixed $method
* @param mixed $timeout
* @param mixed $vars
* @param mixed $allow_redirects
* @return mixed
*/
public static function curl_get_file_contents($url, $method = 'get', $timeout = 30, $vars = array(), $allow_redirects = true)
这很容易调整为:
/**
* Retrieves a file using the cURL extension
*
* @param string $url
* @param string $method
* @param int $timeout
* @param array $vars parameters to pass to cURL
* @param int $allow_redirects boolean choice to follow any redirects $url serves up
* @return mixed
*/
public static function curl_get_file_contents($url, $method = 'get', $timeout = 30, $vars = array(), $allow_redirects = true)
不完全是一个自动化的解决方案,但对于我这个懒惰的开发人员来说已经足够快了:)
我最近不得不做一大批自动化的文档块修复,主要是基于上面的正确答案,以及一些特定于上下文的更改。这是一个黑客,但我在这里链接回去,以防将来对其他人有用。从本质上讲,它在 PHP Beautifier 中对注释块标记进行基本解析。
评论