网站首页 > 知识剖析 正文
引言
为了演示上一篇我们所说的PHP中反射的应用,本篇接着讲反射的应用。因为其特性,是操作函数和方法的,是函数的操作者,类的操作者,所以显得格外重要。
我们从一个小需求出发,假如有一段这样的代码:
function blah($a, $b) { return $a*$b; }
echo getFunctionCode("blah");
当然 getFunctionCode函数本身在PHP中是不存在的,这里是伪代码。有没有可能,根据函数名,获取函数的内部代码呢?
学习时间
这个您真得拿好小本本记好了,非常地重要。这个功能如果是做全局的文档,可能非常实用。生成的文档,自动把函数的内部方法写出来,作为代码示例,实时修改,实时生效。
我们需要借助 ReflectionFunction 用于获取函数的基本信息,比如文件名,开始和结束的行数等等,直接上代码:
$func = new ReflectionFunction('myfunction');
$filename = $func->getFileName();
$start_line = $func->getStartLine() - 1;
$end_line = $func->getEndLine();
$length = $end_line - $start_line;
上述代码假设有一个函数 myfunction,我们获取了 myfunction 所在的文件目录,并且得到了函数开始和结束的行数。
然后可以使用文件操作,将该段代码文本提取出来:
$source = file($filename);
$body = implode("", array_slice($source, $start_line, $length));
print_r($body);
file 函数把整个文件读入到一个数组内,使用 array_slice 切分出 myfunction 所在的行,就是了!
实测
我们使用 Laravel 7 框架内,添加一个助手函数如下:
也就是格式化日期字符串。此函数在 composer 引导加载的时候,会全局有效。
为了测试,在 Commands 内添加临时指令,为了方便调试,使用 $this->info 输出信息:
命令行执行后输出内容如下:
与预想的结果一致。
写在最后
本文通过PHP提供的ReflectionFunction,将全局定义的函数,可以通过获取其绝对路径名,起始和结束行数,将函数的代码段打印出来。可以说是非常高阶而实用了。
Happy coding :-)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
- 上一篇: JS 中的类数组对象如何转换为数组?
- 下一篇: WordPress 内置的数组处理相关函数大全
猜你喜欢
- 2024-11-10 PHP数组学习笔记(1) php数组有哪几种类型
- 2024-11-10 Rust语言入门教程 数组和切片 rust语言例子
- 2024-11-10 javascript自学笔记:Array类型1 javascript自学笔记:array类型1怎么解决
- 2024-11-10 Array.from详解: 语法、功能与应用场景
- 2024-11-10 帮你精通JS:解析与盘点数组array的5类22种方法
- 2024-11-10 10 个实用的 JS 技巧 js常用方法大全
- 2024-11-10 WordPress 内置的数组处理相关函数大全
- 2024-11-10 JS 中的类数组对象如何转换为数组?
- 2024-11-10 Go 中的循环是如何转为汇编的?看完你懂了吗?
- 2024-11-10 Golang,切片,make函数,通过数组产生切片,复制及排序,案例
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)