nikic / PHP-Parser 包的简单实用
解析PHP文件:
<?php require 'vendor/autoload.php'; use PhpParser\ParserFactory; $code = file_get_contents(dirname(__FILE__) . '/src/Aop/Target.php');
$phpFactory = new ParserFactory();
$parser = $phpFactory->create(ParserFactory::PREFER_PHP7);
//var_dump($parser->parse($code));die();
foreach ($parser->parse($code) as $k => $v) {
if ($v instanceof \PhpParser\Node\Stmt\Namespace_) {
echo 'class namespace: ' . join('\\', $v->name->parts), PHP_EOL;
foreach ($v->stmts as $kk => $vv) {
if ($vv instanceof \PhpParser\Node\Stmt\Use_) { //多个use循环
foreach ($vv->uses as $kkk => $vvv) {
echo 'class use: ' . join('\\', $vvv->name->parts), PHP_EOL;
echo 'class use alias: ' . $vvv->alias, PHP_EOL;
}
} elseif ($vv instanceof \PhpParser\Node\Stmt\Class_) {//类内容
echo 'class extends: ' . $vv->extends, PHP_EOL;
echo 'class implements: ' . join(',', $vv->implements), PHP_EOL;
echo 'class name: ' . $vv->name, PHP_EOL;
foreach ($vv->stmts as $kkk => $vvv) {//类属性和方法
if ($vvv instanceof \PhpParser\Node\Stmt\Property) {//属性
foreach ($vvv->props as $kkkk => $vvvv) {
echo 'class property name: ' . $vvvv->name, PHP_EOL;
echo 'class property value: ' . $vvvv->default->value, PHP_EOL;
}
} elseif ($vvv instanceof \PhpParser\Node\Stmt\ClassMethod) {//方法
echo 'class method name: ' . $vvv->name->name, PHP_EOL;
echo 'classs method returnType: ' . $vvv->returnType, PHP_EOL;
foreach ($vvv->params as $kkkk => $vvvv) {//方法参数
echo 'classs method param name: ' . $vvvv->var->name, PHP_EOL;
echo 'classs method param default: ' . $vvvv->default, PHP_EOL;
}
foreach ($vvv->stmts as $kkkk => $vvvv) {//方法返回
echo 'class method return value: ' . $vvvv->expr->value, PHP_EOL;
}
}
}
}
}
}
}
执行后:


nikic / PHP-Parser 包的简单实用的更多相关文章
- Linux下好用的简单实用命令
1.你是否为在输入了一大串命令之后发现第一个字符打错了而苦恼?只能删除重来嘛?或者一步步左移光标? NO,一个组合键轻松搞定 Ctrl+A -----到命令行首 Ctrl+E ------到命令行末 ...
- Victor 串口 VCL 控件 - 简单实用, 功能强大的 C++ Builder 串口控件!
源:Victor 串口 VCL 控件 - 简单实用, 功能强大的 C++ Builder 串口控件! 2014年02月06日发布控件的重要更新版本: Victor 串口控件 1.5.0.2 版本 (包 ...
- C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点
C#反射实现 一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...
- Java注解的基本概念和原理及其简单实用
一.注解的基本概念和原理及其简单实用 注解(Annotation)提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化得方法,使我们可以在稍后某个时刻方便的使用这些数据(通过解析 ...
- .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序
.NET 跨平台RPC框架DotNettyRPC DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...
- hook框架frida的安装以及简单实用案例
1.下载地址 https://github.co/frida/frida/releases 2.另外两种安装方法 1.Install from prebuilt binaries This is th ...
- jQuery的几种简单实用效果
许久未分享博客,或许已生疏. 闲来无事, 分享几个jQuery简单实用的效果案例 不喜勿喷... 1.页面常用的返回顶部 <!DOCTYPE html> <html lang=&qu ...
- 经验分享:10个简单实用的 jQuery 代码片段
尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...
- 简单实用的PHP防注入类实例
这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下 本文实例讲述了简单实用的PHP防注 ...
随机推荐
- UltraEdit设置打开的文件类型,怎么打开大文本文件
点击高级,配置,选择文件处理下的临时文件,设置如图即可打开超大文本文件. 补充:视图——显示行号.
- GitHub项目简介
为了存放代码新建了一个GitHub账号,存放了一些比较常用的代码块,上面的模块大部分都能找到 index.html 文件直接在浏览器打开. 地址:https://github.com/liuzhou1 ...
- tensflow
今天换了电脑,重新安装视频中软件,发现没记录很麻烦,还是记录以下步骤吧 打开终端输入指令:python,如图1所示,我的系统是ubuntu16.04.03,默认安装的python版本为2.7.12. ...
- 1.4 Eclipse 自动补全功能
1.访问Content Assit 菜单项 window--preferences --Java---Editor--Content Assit 2. auto activation delay : ...
- 短网址(t.cn、url.cn)生成,网址缩短接口API
简要说明 短网址api接口有很多格式,不同的接口生成的短网址格式也不同,比如常见的t.cn.url.cn.w.url.cn等格式.总而言之短网址接口就是用来将一个冗长的链接缩短成10个字符以内的短链接 ...
- 吴裕雄 python 机器学习——数据预处理正则化Normalizer模型
from sklearn.preprocessing import Normalizer #数据预处理正则化Normalizer模型 def test_Normalizer(): X=[[1,2,3, ...
- 【笔记】Linux进程间同步和进程绑定至特定cpu
#define _GNU_SOURCE #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> ...
- 【音乐欣赏】《99》 - MOB CHOIR
曲名:99 作者:MOB CHOIR [00:00.000] 作曲 : 佐々木淳一 [00:00.150] 作词 : 佐々木淳一 [00:00.450] [00:02.370]If everyone ...
- Go递归函数
package main import "fmt" func main() { /* 递归函数(recursion):一个函数自己调用自己,就叫做递归函数. 递归函数要有一个出口, ...
- py2
函数相关的 # 生成器相关的# 例1 ll = sum(i for i in range(100000000)) #生成器占资源少 # 例2 def demo(): for i in range(4) ...