php手册中的tokenizer详细总结,基本看它就够了
tokenizer - 解析器
简介:
tokenizer函数提供了一个内嵌在Zend引擎的"PHP tokenizer"的调用接口。使用这些函数,你可以写出你自己的PHP源码分析或者修改工具,而无需处理词法分析级别上的语言规范。
仅包含2个函数:
token_get_all(string $source)
1.token_get_all() 解析提供的 source 源码字符,然后使用 Zend 引擎的语法分析器获取源码中的 PHP 语言的解析器代号
2.$source - 需要解析的php源码
3.返回值:返回源码解析后的所有token标志符数组。
4.每个单独的token标志符,有2种形式:
1>单个字符,例如:: ; , .
2>一个包含3个元素的数组,0-token索引(可调用token_name()来获取字面量) | 1-token源码字符串 | 2-行号
5.实例:
$tokens = token_get_all('<?php echo "dongxuemin"; echo "zhangrui";?>');
解析后:
Array([0] => Array([0] => 379[1] => 1)[1] => Array([0] => 328[1] => echo[2] => 1)[2] => Array([0] => 382[1] => [2] => 1)[3] => Array([0] => 323[1] => "dongxuemin"[2] => 1)[4] => ;[5] => Array([0] => 382[1] => [2] => 1)[6] => Array([0] => 328[1] => echo[2] => 1)[7] => Array([0] => 382[1] => [2] => 1)[8] => Array([0] => 323[1] => "zhangrui"[2] => 1)[9] => ;[10] => Array([0] => 381[1] => ?>[2] => 1))
token_name(int $token)
1.获取提供的 PHP 解析器代号的符号名称
2.$token - 解析器代号的值。接收的是 token_get_all()解析出来的token数组中的第一个元素(token索引),是个int类型
3.返回值:提供的token的符号名
4.实例:
token_name(328); // 返回 'T_OPEN_TAG'
解析器代号列表
1.PHP 语言的不同部分在内部被表示为类似 T_SR 的类型。PHP 在解析错误时输出这样的标识符,例如 "Parse error: unexpected T_SR, expecting ',' or ';' in script.php on line 10."。
2.应该知道 T_SR 的含义。对于所有不知道的人,下表列出了这些标识符,PHP 语法和在手册中适当位置的参考。
3.注意:T_*常量的使用
所有下面列出的token,也被定义为PHP常量。它们的值是基于PHP底层的解析器,自动生成的。这意味着:在两个不同的PHP版本间,同样的token代表的值可能不同。例如:T_FILE常量在PHP5.3是365,在PHP5.4就是369。这也意味着:你的代码绝对不能直接依赖具体某个PHP版本的原始 'T_*' token值,去提供PHP跨版本的兼容性(就是我们不能使用token值作为版本兼容,同一token的值不同版本可能是不同的)。相反你的代码应利用自定义的值 (使用大的数字,像 10000)和适当的策略,来实现 'T_*' 的值和PHP版本兼容性。(我们得将列表中所有的token的值,重新定义,而不采用系统的)
4.不过这里有个疑问:常量的值不可重新定义,也不清楚具体该怎么做,使用变量?主要是不清楚需求...
5.通过解析器代号列表,我们就可以查找我们通过 token_name() 获取到的 token名代表的内容。
该列表,并没有列出token对应的int类型的值,就是因为上面讲的:值是自动生成的,不同版本相同的token是不同的值
上面几点,就是手册上涉及的几个重要概念,我们大概也了解到了,就是:解析php源代码,然后我们自己实现自己的逻辑,接下来,写几个实例(参照别人的博客,或其他地方资料):
1.源码高亮展示,php自带的相关方法有 highlight_string(),highlight_file(),我顺便对这2个方法进行了查看,总结,可参照:
php的语法高亮函数,highlight_string和highlight_file(别名是:show_resource),以及highlight在php.ini中的配置
2.压缩php代码,去除不要的换行、空白以及注释,转载别人的博客,可参照:
PHP Tokenizer 学习笔记
有人指出了 'php_strip_whitespace' 可做相同的事情,就研究下这个函数,看了下手册,里面有个评论,也写了一个压缩php的代码,干脆再写篇文章了
PHP的php_strip_whitespace函数描述,以及手册中写的代码压缩函数-可看看函数是怎么实现的
3.上面博客有人评论说:可做一个能列出某php文件所有函数名,和参数表,感觉这个想法不错,只要和源码相关的,我们都可以想着做
4.在stackoverflow.com上查看了个类似的问题,有人回答,参照链接:
tokenizer的一些实用实例:http://stackoverflow.com/questions/5727951/what-are-some-practical-uses-of-php-tokenizer
1>有的框架用tokenizer生成缓存文件或中间class类文件
2>源代码格式化、高亮显示
3>可收集所有定义的class,methods,variables,文档,注释等
4>一些安全检测等,保证代码更安全。不允许使用的php函数,反正各种安全检测。。。
5>基本上,能使用php代码作为数据的任何地方,我们都可以使用tokennizer。它比使用正则表达式,或其他处理函数,来解析php代码都更可靠。
5.如何在php文件中,查看是否定义了某个类?上面评论里的问题,挺有意思:
1>当可以使用include命令时:
$before = get_declared_classes();include "myfile.php";$after = get_declared_classes();$new_classes = array_diff($before, $after); // 取差集print_r($new_classes); // Outputs all classes defined in myfile.php
对比加载该文件前后,已经定义的类
2>当不可以使用include命令时(有可能因为该文件定义了一个同名的类,会报错!)
可以使用tokenizer分析出该文件所有的class
总结下:
偶然的在dedecms中看源码,看到使用了这个tokenizer函数,就引申出一连串的东西,对手册等函数,一些扩展,稍微底层点的东西,必需都了解!与大家共勉!
php手册中的tokenizer详细总结,基本看它就够了相关推荐
- 如何快速获取淘宝商品的详细信息?看这里就够了
taobao.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret String 是 调用密钥 api_name S ...
- iOS开发中 经常遇到的坑,看我就够了! 韩俊强的博客
从事iOS开发有些年月了,从最开始的磕磕绊绊,不知所措,到现在的遇到困难都能快速做出最佳方案处理,中间经历了不可或缺的痛苦.在项目开发中,本人有用印象笔记记录的习惯,所以很多重复出现的坑,很快迎刃而解 ...
- 关于 scrapy 中 COOKIES_ENABLED 设置 理解问题,看这里就够了
看了很多的文章, 感觉写的都有点扯淡 ,误人子弟 . 源码中 : 默认是注释掉的,但是上面的备注写的是开启状态(没关系, 不管). 所以这个 就有了三个状态: 1. 第一个 源码的 注释状态: # D ...
- 【python】 字典使用教程(超级详细)不看 你怎么够别人卷
文章目录
- char怎么比较_为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?...
在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...
- 10047.GNU Make 使用手册中译版(转)
http://blog.chinaunix.net/resserver.php?blogId=2652&resource=gunmake.htm GNU Make 使用手册(中译版) 翻译:于 ...
- STM32 之十 供电系统及内部参照电压(VREFINT)使用及改善ADC参考电压,内部参照电压的具体方法,只有在STM32F0x芯片的参考手册中才能找到,其他MCU的参考手册都是很简单的说明
STM32 之十 供电系统及内部参照电压(VREFINT)使用及改善ADC参考电压 ZCShouEXP 2018-12-21 10:50:33 16404 收藏 32 展开 问题 今天在使用 ...
- BERT中的Tokenizer说明
BERT中的Tokenizer说明 预训练BERT的Tokenizer有着强大的embedding的表征能力,基于BERT的Tokenizer的特征矩阵可以进行下游任务,包括文本分类,命名实体识别,关 ...
- pythonexcel介绍_Python 中pandas.read_excel详细介绍
Python 中pandas.read_excel详细介绍 #coding:utf-8 import pandas as pd import numpy as np filefullpath = r& ...
- android webview详情,Android中的WebView详细介绍
Android中WebView的详细解释: 1. 概念: WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页. 2. 使用方法: (1).实例化 ...
最新文章
- ffmpeg3.3新版本AVStream的封装流参数由codec替换codecpar
- 【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )
- 24个笔画顺序表_400个生字笔顺表,孩子照着写,家长省心省力!
- HTML与XHTML差额
- 通过 Route 配置的例子,学习SAP Cloud for Customer 的scoping操作
- bootstrap带有下拉按钮的输入框_关于bootstrap--表单(下拉select、输入框input、文本域textare复选框checkbox和单选按钮radio)...
- 数据 正则化 python_python3.6怎么单独正则化/标准化DataFrame中的指定列数据
- Leetcode算法题(C语言)12--旋转图像
- 课节3: 图游走类模型1-deepwalk与node2vec
- 邮件安全上市公司 Mimecast 的部分源代码被 SolarWinds 黑客盗走
- pythonsocket自动化教程_Python基本socket通信控制操作示例
- opencv如何获取图像的平均颜色
- python13文件_python中13个实用的文件操作
- 图片点击后出现模态框效果的实现
- Java完全参考手册_Java完全参考手册(第8版) ((美)Herbert Schildt) pdf扫描版
- Mapper method 'org.xxxxmapper.XXXXXMapper.saveXXXX' has an unsupported return type:
- Zemax操作20--柱透镜
- 小波去噪 语音去噪 信号小波去噪 小波基去噪 小波收缩去噪-matlab
- mysql表join和union_mysql – 使用JOIN和UNION组合来自不同表的记录
- 大数据未来七大发展方向