|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
开发相册系统过程中就有过这样的问题,因为没有交流好,出现重复工作问题,因为文档没有详细的说明而经常临时问对方。
好比, 我供应一个查询办事, 用户可以提交一团体的名字和岁数做为查询前提.
假定我要查询一个名字叫做”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)
接上去完美这个函数体吧:
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;
}
别的, 有一个成绩就是, 假如有多个变量之间有援用, 那末这个函数只是前往最早界说的变量名..
别的, 你也能够参考: http://php.net/manual/en/language.variables.php
用C语言重新编写,包括可以访问数据库。他将这些程序和一些表单直译器整合起来,称为 PHP/FI。PHP/FI 可以和数据库连接,产生简单的动态网页程序。 |
|