PHP 有没简单办法取到实参的名称?

2023-04-27 07:55:05 +08:00
 buxudashi
如题:
function test($str){
var_dump($str);
}
$user='xxx';
test($user);

怎么能在 test 函数内,取到'user'这个字符串。它是实参的名称。
2323 次点击
所在节点    PHP
39 条回复
SelectLanguages
2023-04-27 08:00:23 +08:00
????
$user='xxx';
function test($str){
if($str){
}else{
var_dump($user);
}

}

test($user);
Xusually
2023-04-27 08:05:01 +08:00
最方便的办法是使用反射 ReflectionFunction 。
当然你还可以使用 get_defined_vars()去查找。

能问下你的场景吗,很少有人需要这么做,在做日志工具?
buxudashi
2023-04-27 08:09:24 +08:00
@Xusually 就是简单的保存下调用者的变量名。这样报错时,直接全局查找这个名就知道哪里错了。test 其实是个全局的异常用。
awinds
2023-04-27 08:39:18 +08:00
报错堆栈信息不是有行号吗?
buxudashi
2023-04-27 08:40:06 +08:00
@awinds 跑题了。异常不一定非得报错。
chancefyi
2023-04-27 08:42:48 +08:00
func_get_args()
buxudashi
2023-04-27 08:44:13 +08:00
@chancefyi 这个是以 0 开始索引的参数。取不到名称。
user20190708
2023-04-27 09:09:11 +08:00
据我所知是拿不到
zlhsvc
2023-04-27 09:12:59 +08:00
异常可以自动捕获写入日志的啊,日志打印堆栈信息不就好了,你这操作有点看不明白
suyuyu
2023-04-27 09:13:33 +08:00
能拿到的。以前我也搞过记不清了你试试是不是 debug_backtrace
1343EFF
2023-04-27 09:14:01 +08:00
直接上 try
8355
2023-04-27 09:15:09 +08:00
传入之后就是值拷贝了
咋能取到呢。。。
QlanQ
2023-04-27 09:17:49 +08:00
调用者给的变量名都是不一样的?
异常的捕获和报错不冲突呀
encro
2023-04-27 09:18:16 +08:00
正确的方法:

直接抛出异常,在外层捕获异常,然后就能获得异常的 trace 。
buxudashi
2023-04-27 09:18:49 +08:00
@suyuyu debug_backtrace 这个不行的。反射也不行的。但是有人宣称可以有办法拿到。所以来问。
buxudashi
2023-04-27 09:20:03 +08:00
@encro 不考虑异常的问题,就单纯的想取到实参的名称。
encro
2023-04-27 09:23:20 +08:00
取不到。。。
zjsxwc
2023-04-27 09:23:26 +08:00
https://gist.github.com/zjsxwc/970216c64d7cc5905e86a0d17f62bbb2

我刚刚用 debug_backtrace 写了个 php 取到调用时实参位置的内容。
Rache1
2023-04-27 09:31:12 +08:00
需要安装 nikic/php-parser

https://3v4l.org/elVlX
user20190708
2023-04-27 09:31:59 +08:00
看 $GLOBALS 有这个名字,研究下咋取出来?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/935791

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX