解析基于反射的文栏数据

上传人:第*** 文档编号:32827710 上传时间:2018-02-12 格式:DOCX 页数:4 大小:15.90KB
返回 下载 相关 举报
解析基于反射的文栏数据_第1页
第1页 / 共4页
解析基于反射的文栏数据_第2页
第2页 / 共4页
解析基于反射的文栏数据_第3页
第3页 / 共4页
解析基于反射的文栏数据_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《解析基于反射的文栏数据》由会员分享,可在线阅读,更多相关《解析基于反射的文栏数据(4页珍藏版)》请在金锄头文库上搜索。

1、解析基于反射的文栏数据在前一章中,我介绍了文档注释是如何与程序一起存储的,并以将会介绍如何使用反射技术访问这些数据。访问文档注释数据比较容易.稍后会加以介绍,但是一旦获得了注释数据. 就需要将它解析为一种可用的格式。所以,首先看一下如何解析注释。安装文档块分词器使用文档块分词器可以解析文档块注释信息。然而,安装分词器需要一些技巧。在以下的说明中,假设有一个可用的 pecl 命令。并且使用的是 UNIX. Linux 或者 Mac OSX操作系统,然而,在 Windows 系统中,安装过程是很相似的。首先,布要安装文档块 pecl 扩展。使用管理员账户执行以下的命令即可。Pecl install

2、 docblock文档块包应该有一个稳定的包了,不过.如果还没有的话.就会看到如下的警告信息。Failed to download pecl/docblock within preferred state *stable*,latest release is version 0.2.0,stability “alpha”,use “channel:/ to install在这种情况下,使用命令返网的完整 URL,并且以以下形式重新运行 install 命令。Pecl install channel:/ I |grep DocBlock然后,会看到以下结果如果能够正常运行的话.DocBlock

3、Tokenizer support=enabled如果没有看到这样的输出结果.可能需要在 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 那里实际

4、地获得文档注释数据,以便加以处理。代码演示了如何使用反射技术访问文档注释数据。/*这趋一个文档注释*这个文档注释用夹说明 demo 类*/Class demo()$reflectionClass new ReflectionClass(“demo”);$docComment = $reflectionClass-getDocComment();Print($docComent);执行代码.会生成以下输山结果./*这是个文档注释 *这个文档注释用来说明 demo 类*/下一步,对这个数据做粉刺处理给文档注释数据做分词处理文档块分词器 pecl 扩展的主要方法是 mixed docblock_to

5、kenize($comment,$terseMode=false)简洁模式参数控制了是否在解析结果中包含非语义标识符,如 commentstart 标识符。这个函数会返回一个标识符数组以及与之相关联的数据 r需要的第二个函数是 docblock_token_name($token)函数。这个函数接收一个标识符 ID,这个 ID 是从分词过程返回的数组项的第一个索引。函数会将数字标识符 ID 转换为可读的字符串。getDocComment();$tokens = docblock_tokenize($docComment,true);Foreach($tokens as $token)Echo

6、$token0 .=;Echo docblock_token_name($token1).=;Print_r($token1);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=这一

7、结果看起来让人难以劣迹,仅仅是一些常量而已。但需要的数据已经在里面了。粉刺处理的结果是一个由数组组成的数组。数组中的每个数组项代表了文档块的一部分。每部分都是一个标识符常量以及与之相关联的数据。对于这一粉刺处理的作用来说,我们只关注标签和文字信息。解析标识符/*这是一个文档注释*这个文档注释用来说明 demo 类*author kevin McArthur*example 这是一个多行示例*并且更加有效*example 这是另一个单独的示例/Class demo$reflectionClass = new ReflectionClass(demo);$docComment = $reflect

8、ionClass-getDocComment();$tokens = docblock_tokenize($docComment,true);$comments = array();$tags = array();$tagdata=array();Foreach($tokens as $token)Switch($token0)Case DOCBLOCK_TEXT:If(!isset($tagid)$comments=$token1;elseIf(array_key_exists($tagid,$tagdata)$tagdata$tagid .=”.trim($token1);else$tag

9、data$tagid = trim($token1);Break;Case DOCBLOCK_TAG:$tagid =uniqid();$tags$tagid =trim($token1,);$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

10、$tagName = array();$compiled$tagName = $oldData;$compiled$tagName=$data;else$compiled$tagName=$data;Print_r($comments);Print_r($compiled);解析器执行后输出结果Array(0=This is a doccomment comment1=This doccomment documents the class demo)Array(author=Kevin McArthurexample=Array(0= This is a multiline example a

11、nd this is more than valid1=This is a anthor separate example)在这一解析过程中,需要迭代访问由分词函数产生的标识符。在迭代过程中,需要作出一些假设。如果标签还没有出现,就假设所有的文本都是注释。一旦找到了一个标签,那么在找到新的标签之前,素有的文本都与这个标签相关联值得注意的是一个标签可能拥有多个文本元素,并且必须把这些文本元素追加到标签上。由于标签可以出现多次,所以不能只追加文本。需要给每个标签赋上一个唯一的 ID 值,将它和其他与之同名的标签区别开啦,然后,将标签和她们的唯一 ID 组合起来,并且在拥有多个标签的情况下生成一个数组。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号