php 获取一个变量名字的简单示例

前端之家收集整理的这篇文章主要介绍了php 获取一个变量名字的简单示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
PHP 如何获取一个变量的名字感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!

转来的文章,但根据文章描述,似乎用处不大。与其剩一下传递的参数,然后再通过符号表去获取,我还不如多传一个参数呢,又方便也不混乱。

当然或许本文的作者是在其他地方方现了他的好处也说不定。

比如,我提供一个查询服务,用户可以提交一个人的名字和年龄做为查询条件.

假设我要查询一个名字叫做”laruence”,年龄是27的人,我认为这个人的定义的查询token可以写做:

laruence=27

不幸的是,当这样的一个token做为query string提交给服务器的处理脚本的时候,你就会发现,诶,我不知道用户名是什么,

好吧,于是,你就只好这么写:

username=laruence&age=27

那么,能否获取到一个变量的名字呢?

首先,从可能性上分析,

我们知道,在C语言中,所有的符号在编译器都被”替换”掉了.

而在PHP中,所有的变量都存储在称为”符号表”的HastTable结构中. 在解析执行的过程中,依旧保留着着”符号”信息,所以,肯定是可以获取到的.

而在PHP中,符号的作用域是和活动符号表相关联的. 同一时间,只有一个活动符号表.

那么怎么理解活动符号表和符号表呢?

对于PHP来说,当前活动的符号表是保存在全局变量EG(active_symbol_table)中的,而于此同时,还有个全局符号表保存在EG(symbol_table)中,在进入一个函数调用的执行体之前,会生成一个新的active_symbol_table,并且会保持一个调用栈式样的符号表栈:EG(symtable_cache),以便在退出函数调用的时候,恢复之前的活动符号表(作用域).

同时在PHP中,不能实现作用域继承,也就是不能直接访问作用域外层的符号(需要加上golbal声明),而如果加上global的声明的话,也会在当前的活动作用域生成一个copy,也就是说,不存在在当前作用域可见的符号是保存在全局符号表的.

如上分析,我们只需要在当前的活动符号表中,就可以找到我们需要的变量的名称,

当然,有了这些还不够,我们如何在PHP的脚本中实现获取当前的符号表呢?

get_defined_vars 然而有一个问题要注意,就是get_defined_vars返回的是当前活动符号表中定义的变量名,如果你需要包装一个函数,类似于:

get_variable_name($var)

并且尝试在这个函数中通过get_defined_vars来获取调用get_variable_name时刻的符号表是行不通的.

所以,我们获取变量名字的函数,应该是下面的这个样子:

get_variable_name($var,$scope)

现在,已经得到了当前活动的符号表,接下来,如何得到变量的名字呢?

显然,我们需要根据变量的值去查询这个表,找到值等于要找值的变量,但是,这样做又有一个问题,那就是,可能会有多个变量的值相等啊?

所以,我们需要给这个变量一个唯一值. 而要是想要这个变量,那么,我们的这个目的函数的形式又要变一下了:

get_variable_name(&$var,$scope)

接下来完善这个函数体吧:


<?PHP 
/**
 * PHP 如何获取一个变量的名字
 * @param 
 * @arrange (512.笔记) jb51.cc
 **/
function get_variable_name(&$var,$scope = NULL) { if (NULL == $scope) { $scope = $GLOBALS; } $tmp = $var;
$var = "tmp_exists_" . mt_rand();
$name = array_search($var,$scope,TRUE);
$var = $tmp;
return $name; }
/*** 来自编程之家 jb51.cc(jb51.cc) ***/

另外,有一个问题就是,如果有多个变量之间有引用,那么这个函数只是返回最先定义的变量名..

原文链接:https://www.f2er.com/php/527939.html

猜你在找的PHP相关文章