如何在PHP中以字符串形式获取变量名?

如何在PHP中以字符串形式获取变量名?,php,Php,假设我有以下PHP代码: $FooBar = "a string"; 然后我需要这样一个函数: print_var_name($FooBar); public function getVarName($var) { $tmp = array($var => ''); $keys = array_keys($tmp); return trim($keys[0]); } 其中打印: FooBar 有什么办法可以做到这一点吗?这在PHP中可能吗?我真的看不到这个用

假设我有以下PHP代码:

$FooBar = "a string";
然后我需要这样一个函数:

print_var_name($FooBar);
public function getVarName($var) {      
  $tmp = array($var => '');
  $keys = array_keys($tmp);
  return trim($keys[0]);
}
其中打印:

FooBar

有什么办法可以做到这一点吗?这在PHP中可能吗?

我真的看不到这个用例。。。如果您要键入print\u var\u name($foobar),那么键入print(“foobar”)有什么困难(和不同)

因为即使在函数中使用它,也会得到变量的本地名称


无论如何,这里有一个例子,以防你需要一些东西。

我真的看不到这个用例。。。如果您要键入print\u var\u name($foobar),那么键入print(“foobar”)有什么困难(和不同)

因为即使在函数中使用它,也会得到变量的本地名称

在任何情况下,这里都是一个例子,以防您需要一些东西。

您可以使用它来查找一个变量的名称,该变量的值与您试图查找的名称相同。显然,这并不总是有效的,因为不同的变量通常具有相同的值,但这是我能想到的唯一方法

编辑:get_defined_vars()似乎工作不正常,它返回'var',因为函数本身使用了$var$GLOBALS似乎很管用,所以我把它改成了

function print_var_name($var) {
    foreach($GLOBALS as $var_name => $value) {
        if ($value === $var) {
            return $var_name;
        }
    }

    return false;
}
编辑:要清楚的是,在PHP中没有好的方法可以做到这一点,这可能是因为您不应该这样做。可能有更好的方法来完成您要做的事情。

您可以使用来查找与您要查找的变量名称具有相同值的变量名称。显然,这并不总是有效的,因为不同的变量通常具有相同的值,但这是我能想到的唯一方法

编辑:get_defined_vars()似乎工作不正常,它返回'var',因为函数本身使用了$var$GLOBALS似乎很管用,所以我把它改成了

function print_var_name($var) {
    foreach($GLOBALS as $var_name => $value) {
        if ($value === $var) {
            return $var_name;
        }
    }

    return false;
}

编辑:要清楚的是,在PHP中没有好的方法可以做到这一点,这可能是因为您不应该这样做。可能有更好的方法来完成您要做的事情。

如果变量是可交换的,您必须在某个地方有逻辑来确定使用哪个变量。您只需在执行其他操作时,将变量名放入该逻辑中的
$variable


我想我们都很难理解你为什么需要这个。示例代码或对您实际尝试执行的操作的解释可能会有所帮助,但我怀疑您对这一点想得太多了。

如果变量是可交换的,您必须在某个地方有逻辑来确定使用哪个变量。您只需在执行其他操作时,将变量名放入该逻辑中的
$variable


我想我们都很难理解你为什么需要这个。样例代码或对你实际试图做的解释可能会有所帮助,但我怀疑你是这样的,<强> > < >强>过度思考。

你可以考虑改变你的方法并使用一个变量变量名?

$var_name = "FooBar";
$$var_name = "a string";
那你就可以

print($var_name);
得到

FooBar

这里链接到

你可以考虑改变你的方法并使用一个变量变量名?

$var_name = "FooBar";
$$var_name = "a string";
那你就可以

print($var_name);
得到

FooBar

这是到

的链接,我也没有想到一个有效的方法,但是我想到了这个。它的工作,为有限的用途如下

耸耸肩


//返回
排列
(
[0]=>$foo
[1] =>foo
)
排列
(
[0]=>$bar
[1] =>巴
)
排列
(
[0]=>$baz
[1] =>baz
)

它基于调用函数的行工作,在该行中它查找您传入的参数。我想它可以扩展到处理多个参数,但正如其他人所说,如果你能更好地解释这种情况,另一种解决方案可能会更好。

我也没有想到一种有效的方法,但我想到了这个。它的工作,为有限的用途如下

耸耸肩


//返回
排列
(
[0]=>$foo
[1] =>foo
)
排列
(
[0]=>$bar
[1] =>巴
)
排列
(
[0]=>$baz
[1] =>baz
)

它基于调用函数的行工作,在该行中它查找您传入的参数。我想它可以扩展到处理多个参数,但正如其他人所说,如果你能更好地解释这种情况,另一种解决方案可能会更好。

我实际上有一个有效的用例

我有一个函数cacheVariable($var)(好的,我有一个函数cache($key,$value),但我希望有一个前面提到的函数)

目的是:

$colour = 'blue';
cacheVariable($colour);

我试过了

function cacheVariable($variable) {
   $key = ${$variable}; // This doesn't help! It only gives 'variable'.
   // do some caching using suitable backend such as apc, memcache or ramdisk
}
我也试过了

function varName(&$var) {
   $definedVariables = get_defined_vars();
   $copyOfDefinedVariables = array();
   foreach ($definedVariables as $variable=>$value) {
      $copyOfDefinedVariables[$variable] = $value;
   }
   $oldVar = $var;
   $var = !$var;
   $difference = array_diff_assoc($definedVariables, $copyOfDefinedVariables);
   $var = $oldVar;
   return key(array_slice($difference, 0, 1, true));
}
但这也失败了…:(

当然,我可以继续做缓存('color',$color),但我很懒,你知道…;)

所以,我想要的是一个函数,当它被传递给一个函数时,它会得到一个变量的原始名称。在函数内部,我似乎无法知道这一点。在上面的第二个例子中,通过引用传递get_defined_vars()对我有所帮助(感谢Jean-Jacques Guegan的想法)。后一个函数开始工作,但它仍然只返回局部变量(“变量”,而不是“颜色”)


我还没有尝试使用get_func_args()和get_func_arg()、${}-构造和key()组合,但我认为它也会失败。

我实际上有一个有效的用例

我有一个函数cacheVariable($var)(好的,我有一个函数cache($key,$value),但我希望有一个前面提到的函数)

目的是:

$colour = 'blue';
cacheVariable($colour);

我试过了

function cacheVariable($variable) {
   $key = ${$variable}; // This doesn't help! It only gives 'variable'.
   // do some caching using suitable backend such as apc, memcache or ramdisk
}
我也试过了

function varName(&$var) {
   $definedVariables = get_defined_vars();
   $copyOfDefinedVariables = array();
   foreach ($definedVariables as $variable=>$value) {
      $copyOfDefinedVariables[$variable] = $value;
   }
   $oldVar = $var;
   $var = !$var;
   $difference = array_diff_assoc($definedVariables, $copyOfDefinedVariables);
   $var = $oldVar;
   return key(array_slice($difference, 0, 1, true));
}
但这也失败了…:(

当然,我可以继续做缓存('color',$color),但我很懒,你知道…;)

所以,我想要的是一个函数
/**
 * Prints out $obj for debug
 *
 * @param any_type $obj
 * @param (string) $title
 */
function print_all( $obj, $title = false )
{
    print "\n<div style=\"font-family:Arial;\">\n";
    if( $title ) print "<div style=\"background-color:red; color:white; font-size:16px; font-weight:bold; margin:0; padding:10px; text-align:center;\">$title</div>\n";
    print "<pre style=\"background-color:yellow; border:2px solid red; color:black; margin:0; padding:10px;\">\n\n";
    var_export( $obj );
    print "\n\n</pre>\n</div>\n";
}

print_all( $aUser, '$aUser' );
<?php
function vname(&$var, $scope=0)
{
    $old = $var;
    if (($key = array_search($var = 'unique'.rand().'value', !$scope ? $GLOBALS : $scope)) && $var = $old) return $key;  
}
?>
<?php
//1.  Use of a variable contained in the global scope (default):
  $my_global_variable = "My global string.";
  echo vname($my_global_variable); // Outputs:  my_global_variable

//2.  Use of a local variable:
  function my_local_func()
  {
    $my_local_variable = "My local string.";
    return vname($my_local_variable, get_defined_vars());
  }
  echo my_local_func(); // Outputs: my_local_variable

//3.  Use of an object property:
  class myclass
  {
    public function __constructor()
    {
      $this->my_object_property = "My object property  string.";
    }
  }
  $obj = new myclass;
  echo vname($obj->my_object_property, $obj); // Outputs: my_object_property
?>
class DebugHelper {

    function printVarNames($systemDefinedVars, $varNames) {
        foreach ($systemDefinedVars as $var=>$value) {
            if (in_array($var, $varNames )) {
                var_dump($var);
                var_dump($value);
            }
        }
    }
}
DebugHelper::printVarNames(
    $systemDefinedVars = get_defined_vars(),
    $varNames=array('yourVar00', 'yourVar01')
);
function getReference(&$var)
{
    if(is_object($var))
        $var->___uniqid = uniqid();
    else
        $var = serialize($var);
    $name = getReference_traverse($var,$GLOBALS);
    if(is_object($var))
        unset($var->___uniqid);
    else
        $var = unserialize($var);
    return "\${$name}";    
}

function getReference_traverse(&$var,$arr)
{
    if($name = array_search($var,$arr,true))
        return "{$name}";
    foreach($arr as $key=>$value)
        if(is_object($value))
            if($name = getReference_traverse($var,get_object_vars($value)))
                return "{$key}->{$name}";
}
class A
{
    public function whatIs()
    {
        echo getReference($this);
    }
}

$B = 12;
$C = 12;
$D = new A;

echo getReference($B)."<br/>"; //$B
echo getReference($C)."<br/>"; //$C
$D->whatIs(); //$D
    $variableName = "ajaxmint";

    echo getVarName('$variableName');

    function getVarName($name) {
        return str_replace('$','',$name);
    }
function get_user_var_defined () 
{
    return array_slice($GLOBALS,8,count($GLOBALS)-8);     
}

function get_var_name ($var) 
{
    $vuser = get_user_var_defined(); 
    foreach($vuser as $key=>$value) 
    {
        if($var===$value) return $key ; 
    }
}
function VarTest($my_var,$my_var_name){
    echo '$'.$my_var_name.': '.$my_var.'<br />';
}

$fruit='apple';
VarTest($fruit,'fruit');
function compact_assoc(&$v1='__undefined__', &$v2='__undefined__',&$v3='__undefined__',&$v4='__undefined__',&$v5='__undefined__',&$v6='__undefined__',&$v7='__undefined__',&$v8='__undefined__',&$v9='__undefined__',&$v10='__undefined__',&$v11='__undefined__',&$v12='__undefined__',&$v13='__undefined__',&$v14='__undefined__',&$v15='__undefined__',&$v16='__undefined__',&$v17='__undefined__',&$v18='__undefined__',&$v19='__undefined__'
) {
    $defined_vars=get_defined_vars();

    $result=Array();
    $reverse_key=Array();
    $original_value=Array();
    foreach( $defined_vars as $source_key => $source_value){
        if($source_value==='__undefined__') break;
        $original_value[$source_key]=$$source_key;
        $new_test_value="PREFIX".rand()."SUFIX";
        $reverse_key[$new_test_value]=$source_key;
        $$source_key=$new_test_value;

    }
    foreach($GLOBALS as $key => &$value){
        if( is_string($value) && isset($reverse_key[$value])  ) {
            $result[$key]=&$value;
        }
    }
    foreach( $original_value as $source_key => $original_value){
        $$source_key=$original_value;
    }
    return $result;
}


$a = 'A';
$b = 'B';
$c = '999';
$myArray=Array ('id'=>'id123','name'=>'Foo');
print_r(compact_assoc($a,$b,$c,$myArray) );

//print
Array
(
    [a] => A
    [b] => B
    [c] => 999
    [myArray] => Array
        (
            [id] => id123
            [name] => Foo
        )

)
$backtrace = debug_backtrace();
echo '# Debug function called from ' . $backtrace[0]['file'] . ' at line ' . $backtrace[0]['line'];
public function getVarName($var) {      
  $tmp = array($var => '');
  $keys = array_keys($tmp);
  return trim($keys[0]);
}
$FooBar = "a string";

$newArray = compact('FooBar');
foreach($newarray as $key => $value) {
    echo $key;
}
$vars = array('FooBar' => 'a string');
function print_var_name(){
    // read backtrace
    $bt   = debug_backtrace();
    // read file
    $file = file($bt[0]['file']);
    // select exact print_var_name($varname) line
    $src  = $file[$bt[0]['line']-1];
    // search pattern
    $pat = '#(.*)'.__FUNCTION__.' *?\( *?(.*) *?\)(.*)#i';
    // extract $varname from match no 2
    $var  = preg_replace($pat, '$2', $src);
    // print to browser
    echo '<pre>' . trim($var) . ' = ' . print_r(current(func_get_args()), true) . '</pre>';
}
$data = array('$FooBar');  

$vars = [];  
$vars = preg_replace('/^\\$/', '', $data); 

$varname = key(compact($vars));  
echo $varname;
$FooBar = "a string";  

$varname = trim(array_search($FooBar, $GLOBALS), " \t.");  
echo $varname;
if (isset($FooBar) && !is_null($FooBar) && !empty($FooBar)) {
    $FooBar = "a string";
    $varname = trim(array_search($FooBar, $GLOBALS), " \t.");
}
function getVar(&$var) {
    $tmp = $var; // store the variable value
    $var = '_$_%&33xc$%^*7_r4'; // give the variable a new unique value
    $name = array_search($var, $GLOBALS); // search $GLOBALS for that unique value and return the key(variable)
    $var = $tmp; // restore the variable old value
    return $name;
}
$city  = "San Francisco";
echo getVar($city); // city
<?php
    // Function for determining the name of a variable
    function getVarName(&$var, $definedVars=null) {
        $definedVars = (!is_array($definedVars) ? $GLOBALS : $definedVars);
        $val = $var;
        $rand = 1;
        while (in_array($rand, $definedVars, true)) {
            $rand = md5(mt_rand(10000, 1000000));
        }
        $var = $rand;
         
        foreach ($definedVars as $dvName=>$dvVal) {
            if ($dvVal === $rand) {
                $var = $val;
                return $dvName;
            }
        }
         
        return null;
    }
 
    // the name of $a is to be determined.   
    $a = 1;
     
    // Determine the name of $a
    echo getVarName($a);
?>