技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> 如何获取一个变量的名字

如何获取一个变量的名字

浏览:1763次  出处信息

比如, 我提供一个查询服务, 用户可以提交一个人的名字和年龄做为查询条件.
假设我要查询一个名字叫做”laruence”, 年龄是27的人, 我认为这个人的定义的查询token可以写做:

  1.    laruence=27

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

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

  1. 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的脚本中实现获取当前的符号表呢?

  1.   get_defined_vars
  2.  

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

  1.   get_variable_name($var)

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

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

  1.   get_variable_name($var, $scope)

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

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

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

  1.   get_variable_name(&$var, $scope)

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

  1. function get_variable_name(&$var, $scope = NULL) {
  2.        if (NULL == $scope) {
  3.           $scope = $GLOBALS;
  4.        }
  5.  
  6.        $tmp = $var;
  7.  
  8.        $var = "tmp_exists_" . mt_rand();
  9.  
  10.        $name = array_search($var, $scope, TRUE);
  11.  
  12.        $var = $tmp;
  13.  
  14.        return $name;
  15. }

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

另外, 你也可以参考: http://php.net/manual/en/language.variables.php

关于作用域, 你也可以参看我之前的文章: 深入理解PHP原理之变量作用域(Scope in PHP)

建议继续学习:

  1. Axure之变量的使用    (阅读:4156)
  2. 从shell中向awk传递变量实例    (阅读:3549)
  3. 深入PHP使用技巧之变量    (阅读:3461)
  4. 变量在内存中的位置    (阅读:2956)
  5. Linux的shell变量    (阅读:2644)
  6. c语言全局变量和局部变量问题汇总    (阅读:2651)
  7. PHP的可变变量名    (阅读:2139)
  8. 详解Linux bash中的变量    (阅读:1892)
  9. PHP 中对变量unset,可以销毁变量中的资源    (阅读:1846)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
后一篇:PHP最佳实践 >>
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1