解析基于反射的文栏数据

2024-10-11 21:36:08

1、解析基于反射的文栏数据文档注释是如何与程序一起存储的,并以将会介绍如何使用反射技术访问这些数据。访问文档注释数据比较容易.稍后会加以介绍,但是一旦获得了注释数据.就需要将它解析为一种可用的格式。所以,首先看一下如何解析注释。}安装文档块分词器 使用文档块分词器可以解析文档块注释信息。然而,安装分词器需要一些技巧。 在以下的说明中,假设有一个可用的pecl命令。并且使用的是UNIX. Linux或者Mac OSX操作系统,然而,在Windows系统中,安装过程是很相似的。 首先,布要安装文档块pecl扩展。使用管理员账户执行以下的命令即可。Pecl install docblock文档块包应该有一个稳定的包了,不过.如果还没有的话.就会看到如下的警告信息。Failed to download pecl/docblock within preferred state *stable*,latest release is version 0.2.0,stability “alpha”,use “channel://pecl.php.net/docblock-0.2.0” to install在这种情况下,使用命令返网的完整URL,并且以以下形式重新运行install命令。Pecl install channel://pecl.php.net/docblock-0.2.0如果一切正常,就应该已经安装好文档块分词器了,使用以下命令可以确认它是否能够正确运行 Php –I |grep DocBlock然后,会看到以下结果〔如果能够正常运行的话〕.DocBlock Tokenizer support=>enabled

2、如果没有看到这样的输出结果.可能需要在php.ini文件中激活扩展。执行以下命令找到Php.ini文件Php –I |grep php.ini应该得到与以下类似的结果。Configuration File (php.ini) Path=>/etc/php5.1/cli/php.ini然后,需要向php.ini文件添加以一下文本以激活文档块扩展。Extension=docblock.so最后,重新执行命令以检查文档块是否已经安装成功。 只要文档块扩展开始运行,就可以使用分词器风格的解析器去解析文档块注释。然而,首先需要从反射API那里实际地获得文档注释数据,以便加以处理。

3、代码演示了如何使用反射技术访问文档注释数据。/*这趋一个文档注释*这个文档注释用夹说明demo类*/Class demo(){$reflectionClass new ReflectionClass(“demo”);$docComment = $reflectionClass->getDocComment();Print($docComent);}执行代码.会生成以下输山结果. /*这是个文档注释 *这个文档注释用来说明demo类 */ 下一步,对这个数据做粉刺处理给文档注释数据做分词处理文档块分词器pecl扩展的主要方法是mixed docblock_tokenize($comment,$terseMode=false)简洁模式参数控制了是否在解析结果中包含非语义标识符,如commentstart标识符。这个函数会返回一个标识符数组以及与之相关联的数据r 需要的第二个函数是docblock_token_name($token)函数。这个函数接收一个标识符ID,这个ID是从分词过程返回的数组项的第一个索引。函数会将数字标识符ID转换为可读的字符串。<?php /* *这是一个文档注释 *这个文档注释用来说明demo类*/Class demo{}$reflectionClass = new ReflectionClass(‘demo’);$docComment = $reflectionClass->getDocComment();$tokens = docblock_tokenize($docComment,true);Foreach($tokens as $token){ Echo $token[0] .’=’; Echo docblock_token_name($token[1]).’=’; Print_r($token[1]); Echo “\n”;}这段代码的输出结果如下1=DOCBLOCK_NEWLINE=2=DOCBLOCK_WHITESPACE=36=DOCBLOCK_TEXT=This is a doccomment1=DOCBLOCK_NEWLINE=1=DOCBLOCK_NEWLINE=2=DOCBLOCK_WHITESPACE=36=DOCBLOCK_TEXT=This doccomment documents the class demo1=DOCBLOCK_NEWLINE=这一结果看起来让人难以劣迹,仅仅是一些常量而已。但需要的数据已经在里面了。

4、分词处理的结果是一个由数组组成的数组。数组中的坡庥汩赴每个数组项代表了文档块的一部分。每部分都是一个标识符常量以及与之相关联的数据。对于这一分词处理的作用来说,我们只关注标签和文字信息。解析标识符/*忮氽阝另**这是一个文档注释*这个文档注释用来说明demo类**@author kevin McArthur*@example 这是一个多行示例*并且更加有效*@example 这是另一个单独的示例/Class demo{}$reflectionClass = new ReflectionClass(‘demo’);$docComment = $reflectionClass->getDocComment();$tokens = docblock_tokenize($docComment,true);$comments = array();$tags = array();$tagdata=array();Foreach($tokens as $token){ Switch($token[0]){ Case DOCBLOCK_TEXT: If(!isset($tagid)){ $comments[]=$token[1];}else{ If(array_key_exists($tagid,$tagdata)){ $tagdata[$tagid] .=””.trim($token[1]);}else{ $tagdata[$tagid] = trim($token[1]);}}Break; Case DOCBLOCK_TAG: $tagid =uniqid(); $tags[$tagid] =trim($token[1],’@’);}}$compiled =array();Foreach($tagdata as $tagid=>$data){ $tagName = $tags[$tagid];/** 为具有相同名称的多个标签创建数组*/If(array_key_exists($tagName,$compiled)){If(!is_array($compiled[$tagName])){$oldData = $compiled[$tagName];$compiled[$tagName] = array();$compiled[$tagName] = $oldData;}$compiled[$tagName][]=$data;}else{ $compiled[$tagName]=$data;}}Print_r($comments);Print_r($compiled);解析器执行后输出结果Array( [0]=>This is a doccomment comment [1]=>This doccomment documents the class demo)Array( [author]=>Kevin McArthur [example]=>Array([0]=> This is a multiline example and this is more than valid[1]=>This is a anthor separate example))在这一解析过程中,需要迭代访问由分词函数产生的标识符。在迭代过程中,需要作出一些假设。如果标签还没有出现,就假设所有的文本都是注释。一旦找到了一个标签,那么在找到新的标签之前,素有的文本都与这个标签相关联 值得注意的是一个标签可能拥有多个文本元素,并且必须把这些文本元素追加到标签上。由于标签可以出现多次,所以不能只追加文本。需要给每个标签赋上一个唯一的ID值,将它和其他与之同名的标签区别开啦,然后,将标签和她们的唯一ID组合起来,并且在拥有多个标签的情况下生成一个数组。

猜你喜欢