PHP에서 변수 이름을 문자열로 얻는 방법은 무엇입니까?


201

이 PHP 코드가 있다고 가정 해보십시오.

$FooBar = "a string";

그런 다음 다음과 같은 기능이 필요합니다.

print_var_name($FooBar);

어떤 인쇄 :

FooBar

이것을 달성하는 방법에 대한 아이디어가 있습니까? PHP에서도 가능합니까?


9
디버깅 이외의 용도로이 작업이 필요한 경우 심각하게 잘못한 것입니다. 사용 사례는 무엇입니까?
troelskn

10
좋은 질문. 디버깅에도 동일하게 필요했습니다.
takeshin

17
+1-모델 PHP 객체에서 XML 또는 JSON 응답을 자동 생성하기 위해 이것이 필요했습니다. 다른 명명 된 rootName => modelObject배열 안에 객체를 감쌀 필요가 있으면 응답에 불필요한 깊이가 추가됩니다. 이것이 언어의 런타임 반영 기능에 포함되기를 바랍니다.
Anurag

4
로깅 기능 에서도이 기능이 필요했습니다. 다음을 수행하고 싶었습니다. log ($ didTheSystemBlowUp); 로그 파일에 다음과 같이 표시하려면 : $ didTheSystemBlowUp = '아직, 그러나 곧';
SeanDowney

4
또한 var_dump ()를 호출 할 때 유용 할 수 있으므로 여러 변수에서 동시에 호출 할 때 vardupm의 출력을 구별하기 위해 var name을 수동으로 출력하지 않았습니다.
PHPst

답변:


37

get_defined_vars () 를 사용 하여 이름을 찾으려는 것과 동일한 값을 갖는 변수의 이름을 찾을 수 있습니다. 다른 변수는 종종 같은 값을 가지기 때문에 이것이 항상 작동하지는 않지만 이것이 내가 생각할 수있는 유일한 방법입니다.

편집 : 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 에서이 작업을 수행하는 좋은 방법이 없습니다. 아마도 그렇게 할 필요가 없기 때문일 것입니다. 당신이하려는 일을하는 더 좋은 방법이있을 것입니다.


2
아 ;-) 느리게 생각했지만 $ GLOBALS를 대신 사용했습니다. 따라서 동일 스칼라 값 ($ a = 'foo'; $ b = 'foo'; assert ($ a === $ b);)에 대한 항등 비교는 true입니다.
Argelbargel

실제로 코드를 테스트 했으므로 코드에서 함수에 사용 중이므로 항상 'var'을 반환했습니다. 대신 $ GLOBALS를 사용하면 어떤 이유로 올바른 변수 이름을 반환합니다. 위 코드를 $ GLOBALS를 사용하도록 변경하겠습니다.
Jeremy Ruten

예, 깨달았지만 get_defined_vars ()는 충분합니다.
게리 수도꼭지

2
이 코드가 예상대로 작동하지 않는 경우가 많이 있습니다.
troelskn

122
이 코드는 잘못되었습니다. 변수가 VALUE에 의해 전달 된 변수와 동일한 지 확인하는 것은 매우 바보 같은 생각입니다. 주어진 시점에서 수많은 변수가 NULL입니다. 무수히는 1로 설정되어 있습니다.
Alex Weinstein 5

49

나는 이것을 효율적으로 수행하는 방법을 생각할 수 없었지만 이것을 생각해 냈습니다. 아래의 제한된 용도로 작동합니다.

어깨를 으쓱하다

<?php

function varName( $v ) {
    $trace = debug_backtrace();
    $vLine = file( __FILE__ );
    $fLine = $vLine[ $trace[0]['line'] - 1 ];
    preg_match( "#\\$(\w+)#", $fLine, $match );
    print_r( $match );
}

$foo = "knight";
$bar = array( 1, 2, 3 );
$baz = 12345;

varName( $foo );
varName( $bar );
varName( $baz );

?>

// Returns
Array
(
    [0] => $foo
    [1] => foo
)
Array
(
    [0] => $bar
    [1] => bar
)
Array
(
    [0] => $baz
    [1] => baz
)

함수를 호출 한 줄을 기반으로 작동합니다. 여기서 전달 된 인수를 찾으십시오. 여러 인수와 함께 작동하도록 확장 할 수 있다고 생각하지만 다른 사람들이 말했듯이 상황을 더 잘 설명 할 수 있다면 다른 해결책이 될 것입니다 더 잘 작동합니다.


2
varName 함수가 찾을 변수와 동일한 파일에 정의 된 경우에만 작동합니다.
rubo77

1
: 여기 당신은 더 나은 몇 가지 이상의 작품이 포함 구현 찾을 stackoverflow.com/a/19788805/1069083
rubo77

31

접근 방식을 변경하고 변수 변수 이름을 사용하는 것을 고려할 수 있습니까?

$var_name = "FooBar";
$$var_name = "a string";

그럼 당신은 단지

print($var_name);

얻을

FooBar

변수 변수에 대한 PHP 매뉴얼 링크는 다음과 같습니다.


42
변수 변수를 광범위하게 사용하는 시스템으로 작업했습니다. 경고하겠습니다. 정말 빨리 냄새가납니다!
Icode4food

3
대부분의 경우 사용자는 var의 이름과 값을 얻으려고합니다. "function debugvar ($ varname)"이라고 생각하고 "debugvar ( 'foo')"라고 부르려고 디버그에 "foo = 123"이 표시됩니다. 변수 변수를 사용하면 'foo'가 정의되지 않습니다.
gcb

실제로하고있는 것을보십시오. 예제에서 실제로 $FooBar값을 사용 하여 변수 를 작성하면 a string매뉴얼을 읽습니다. 이것은 끔찍한 임호입니다. 변수 $FooBar에 값을 할당하지 않지만 거기에 있습니다. OUCH
Toskan

20

아무도 근본적인 이유를 언급 한 것 같다 이) 현명) 하드와 B A입니다 :

  • "변수"는 다른 것을 가리키는 기호 일뿐입니다. PHP에서는 내부적으로 뭔가 포인트가 같은 값을 가지고 있기 때문에 중 (PHP 구현 뭔가라는 사실은 동시에 여러 변수에 사용할 수있는,는 "zval을"소위 "복사 (copy-on-write)"가이 있도록 $foo = $bar할 필요가 없습니다 추가 메모리를 바로 할당하거나 참조로 (예 :) 할당했거나 함수에 전달 했으므로 $foo =& $bar. 따라서 zval에는 이름이 없습니다.
  • 매개 변수를 함수에 전달 하면 참조 인 경우에도 변수를 작성 하게됩니다. 와 같은 익명의 것을 전달할 수 "hello"있지만 함수 내부에서 이름을 지정하는 변수는 무엇이든 가능합니다. 이 코드 분리에 매우 근본적인 : 함수가 변수가 무엇인지에 의존하는 경우 사용 호출 할, 그것은 더 같은 것 goto제대로 별도의 기능 이상.
  • 전역 변수는 일반적으로 나쁜 생각으로 간주됩니다. 여기에서 많은 예제는 "반영"하고자하는 변수가에서 찾을 수 있다고 가정 $GLOBALS하지만, 코드를 잘못 구조화하고 변수가 일부 함수 또는 객체로 범위를 지정하지 않은 경우에만 적용됩니다.
  • 프로그래머가 코드를 읽을 수 있도록 변수 이름이 있습니다. 목적에 더 잘 맞도록 변수 이름을 바꾸는 것은 매우 일반적인 리팩토링 관행이며, 요점은 차이가 없다는 것입니다.

이제는 디버깅에 대한 요구가 있음을 이해하지만 (일부 제안 된 사용법은 그 이상으로 넘어가지만) 일반화 된 솔루션으로는 실제로 생각하는 것만 큼 도움이되지 않습니다. 디버그 함수에 변수가 "$ file이라고 표시되면 ", 코드에있는 수십 개의"$ file "변수 또는"$ filename "이라는 변수는"$ file "이라는 매개 변수가있는 함수로 전달되는 변수 일 수 있습니다.

훨씬 유용한 정보는 코드에서 디버그 함수가 호출 된 위치입니다. 에디터에서 이것을 빨리 찾을 수 있기 때문에 어떤 변수를 출력했는지 확인할 수 있으며 전체 표현식을 한 번에 전달할 수도 있습니다 (예 :) debug('$foo + $bar = ' . ($foo + $bar)).

이를 위해 디버그 기능 맨 위에서이 스 니펫을 사용할 수 있습니다.

$backtrace = debug_backtrace();
echo '# Debug function called from ' . $backtrace[0]['file'] . ' at line ' . $backtrace[0]['line'];

이미 좋은 답변이 있습니다. 따라서 이것은 현실에도 불구하고 비관적입니다.
a20

@ a20 모든 답은 언제 사용할 수 있는지, 언제 깨질 것인지에 대해 심각한 경고가 있습니다. 어떤 변수도 그 이름으로 간단하게 조회 할 수 없습니다. 왜냐하면 사실상 불가능하기 때문입니다. 일부는 디버깅 목적으로 많은 펑키 반사를 수행합니다. 그러나 내 의견 은 줄 번호를 출력하고 소스 줄을 직접 찾거나 XDebug와 같은 대화 형 디버거를 사용하는 것이 더 낫다는 의견 입니다.
IMSoP

14

이것은 정확히 당신이 원하는 것입니다-주어진 var의 이름을 반영하는 "복사 및 드롭 인"기능을 사용할 준비가되었습니다.

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 trim($var);
}

사용법 : print_var_name ($ FooBar)

인쇄 : FooBar

힌트 이제 기능의 이름을 바꿀 수 있으며 여전히 작동하며 한 줄에 여러 번 기능을 사용할 수 있습니다! @Cliffordlife 감사합니다


3
멋지다. 고마워. $pat = '#(.*)'.__FUNCTION__.' *?\( *?(.*) *?\)(.*)#i';이 방식으로 $ pat 행을 약간 수정했습니다. 이 디버그 함수가 호출되는 것을 신경 쓰지 않고 $ hello 또는 "hello"와 같이 함수에 전달되는 것을 정확히 얻습니다 (전달 된 변수에 대해 $ 일치를 삭제했습니다) 같은 줄에)
Cliffordlife

1
환상적인 코드 조각! 감사! 그러나 모든 경우에 작동하지는 않습니다. PHP 7.2.19를 사용하여 우분투 18.04에서 테스트 한 결과 : 동일한 코드 줄에서 여러 번 사용될 때 작동하지 않습니다. 하나 또는 별도의 표현식에 사용되는지 여부에 관계없이 선. 동일한 식이지만 별도의 줄에 사용되면 작동합니다. 다른 라인에서 다른 표현식으로 사용됩니다.
Matty

1
또한 그 기능은 "var_dump"없이 한 줄에 있어야합니다. – 조합 print_var_name, echo, var_dump전송 출력$variable); echo ' '; var_dump($variable
BG Bruno

13

PHP.net의 Lucas는 변수가 있는지 확인하는 안정적인 방법을 제공했습니다. 그의 예에서, 변수의 전역 변수 배열 (또는 범위 배열)의 사본을 반복하고 값을 임의로 생성 된 값으로 변경 한 후 복사 된 배열에서 생성 된 값을 확인합니다.

function variable_name( &$var, $scope=false, $prefix='UNIQUE', $suffix='VARIABLE' ){
    if($scope) {
        $vals = $scope;
    } else {
        $vals = $GLOBALS;
    }
    $old = $var;
    $var = $new = $prefix.rand().$suffix;
    $vname = FALSE;
    foreach($vals as $key => $val) {
        if($val === $new) $vname = $key;
    }
    $var = $old;
    return $vname;
}

그런 다음 시도하십시오.

$a = 'asdf';
$b = 'asdf';
$c = FALSE;
$d = FALSE;

echo variable_name($a); // a
echo variable_name($b); // b
echo variable_name($c); // c
echo variable_name($d); // d

PHP.net에서 자신의 게시물을 확인하십시오 : http://php.net/manual/en/language.variables.php


배열 형태로 현재 범위를 어떻게 얻습니까?
Sebastián Grignoli

좋은! 나를 위해 누락 된 것은 break;foreach에서 동등하게 발견되었을 때 + 함수 내부에 정의 된 경우에도 자동으로 var_name을 가져 오기 위해 사용 가능한 기본 구조를 수행했습니다. 복사 및 붙여 넣기를 자주하거나 개선 할 생각이 더 있다면variable_name( $variable, ( empty(__FUNCTION__) ? false : get_defined_vars() ) );
odie2

이것은 아마도 작업을 수행하는 가장 빠르고 깨끗한 방법 일 것입니다. 디버깅에는 성능 문제가 포함될 수 있습니다. 이 함수는 중단없이 할당하는 대신 foreach 루프에서 직접 반환해야합니다. GLOBALS가 크면 성능이 크게 향상 될 수 있습니다.
John

13

디버깅 이유로 검사 기능을 만들었습니다. 스테로이드의 print_r ()과 비슷하지만 Krumo와 비슷하지만 객체에는 조금 더 효과적입니다. var 이름 감지를 추가하고 싶었습니다.이 페이지의 Nick Presta의 게시물에서 영감을 얻었습니다. 변수 이름뿐만 아니라 인수로 전달 된 표현식을 감지합니다.

전달 된 표현식을 감지하는 랩퍼 함수입니다. 대부분의 경우에 작동합니다. 동일한 코드 줄에서 함수를 두 번 이상 호출하면 작동하지 않습니다.

이것은 잘 작동합니다 : die ( inspect ($ this-> getUser ()-> hasCredential ( "삭제")) );

inspect ()는 전달 된 표현식을 감지하는 함수입니다.

우리는 얻는다 : $ this-> getUser ()-> hasCredential ( "delete")

function inspect($label, $value = "__undefin_e_d__")
{
    if($value == "__undefin_e_d__") {

        /* The first argument is not the label but the 
           variable to inspect itself, so we need a label.
           Let's try to find out it's name by peeking at 
           the source code. 
        */

        /* The reason for using an exotic string like 
           "__undefin_e_d__" instead of NULL here is that 
           inspected variables can also be NULL and I want 
           to inspect them anyway.
        */

        $value = $label;

        $bt = debug_backtrace();
        $src = file($bt[0]["file"]);
        $line = $src[ $bt[0]['line'] - 1 ];

        // let's match the function call and the last closing bracket
        preg_match( "#inspect\((.+)\)#", $line, $match );

        /* let's count brackets to see how many of them actually belongs 
           to the var name
           Eg:   die(inspect($this->getUser()->hasCredential("delete")));
                  We want:   $this->getUser()->hasCredential("delete")
        */
        $max = strlen($match[1]);
        $varname = "";
        $c = 0;
        for($i = 0; $i < $max; $i++){
            if(     $match[1]{$i} == "(" ) $c++;
            elseif( $match[1]{$i} == ")" ) $c--;
            if($c < 0) break;
            $varname .=  $match[1]{$i};
        }
        $label = $varname;
    }

    // $label now holds the name of the passed variable ($ included)
    // Eg:   inspect($hello) 
    //             => $label = "$hello"
    // or the whole expression evaluated
    // Eg:   inspect($this->getUser()->hasCredential("delete"))
    //             => $label = "$this->getUser()->hasCredential(\"delete\")"

    // now the actual function call to the inspector method, 
    // passing the var name as the label:

      // return dInspect::dump($label, $val);
         // UPDATE: I commented this line because people got confused about 
         // the dInspect class, wich has nothing to do with the issue here.

    echo("The label is: ".$label);
    echo("The value is: ".$value);

}

인스펙터 기능 (및 내 dInspect 클래스)의 예는 다음과 같습니다.

http://inspect.ip1.cc

해당 페이지에는 텍스트가 스페인어로되어 있지만 코드는 간결하고 이해하기 쉽습니다.


1
errrm, NuSphare 디버거 설치에 의존하지 않습니까?
Mawg는 모니카

나는이 코드의 단순화 된 버전을 거기에 게시했다. 또한이 답변을 수정했습니다. 이제 모든 PHP5 구현에서 실행되어야합니다.
Sebastián Grignoli

이와 같은 독창성은 사람들이 "할 수 없음"또는 "불가능"이라고 말할 때마다 미소를 짓는 이유입니다.이 경우에는 Rasmus 자신도 포함됩니다. Sebastián과이 답변에 기여한 다른 사람에게 도움이 될 것입니다.
Night Owl

1
고마워요 밤 올빼미, 그러나 이것은 방탄이 아니라고 주장합니다 (답변 상태로, "inspect ()"함수가 한 줄에 두 번 이상 호출되면 실패합니다!). 나는 이것을 프로덕션에서 사용하지 않을 것입니다. 프로덕션 서버에 절대 도달해서는 안되는 디버깅 관리자 기능 전용입니다.
Sebastián Grignoli

7

에서 php.net

@Alexandre-짧은 솔루션

<?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
?>

4

많은 응답자들이 이것의 유용성에 의문을 제기합니다. 그러나 변수에 대한 참조를 얻는 것이 매우 유용 할 수 있습니다. 특히 객체와 $ this의 경우 . 내 솔루션은 객체 및 속성 정의 객체로 작동합니다.

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

2

많은 변수에 대한 위의 답변에서 좋은 성능을 발휘하며 많은 $ GLOBALS 스캔 만 수행합니다.

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
        )

)

1

변수를 교환 할 수 있는 경우 사용할 변수를 결정하는 어딘가에 논리가 있어야합니다 . 변수 이름을 입력하기 만하면됩니다.$variable다른 모든 일을하는 동안 해당 논리 내에 됩니다.

나는 우리가 당신이 무엇을 필요로하는지 이해하는데 어려움을 겪고 있다고 생각합니다. 샘플 코드 또는 당신이 실제로하려고하는지에 대한 설명을 힘 도움말을,하지만 난 당신에게있는 거 방법을 의심, 방법 이 지나친.


1

실제로 유효한 사용 사례가 있습니다.

cacheVariable ($ var) 함수가 있습니다 (ok, 함수 캐시 ($ key, $ value)가 있지만 언급 한대로 함수를 갖고 싶습니다).

목적은 다음과 같습니다.

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

...

// another session

...

$myColour = getCachedVariable('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));
}

그러나 이것은 또한 실패합니다 ... :(

물론, 나는 캐시 ( 'colour', $ colour)를 계속 할 수는 있지만 게으르다.

그래서 내가 원하는 것은 변수가 함수에 전달 될 때 변수의 원래 이름을 얻는 함수입니다. 함수 안에는 내가 알 수있는 방법이 없습니다. 위의 두 번째 예제에서 get_defined_vars ()를 참조로 전달하면 (Jean-Jacques Guegan에게 감사드립니다) 다소 도움이되었습니다. 후자의 함수가 작동하기 시작했지만 여전히 로컬 변수 ( 'color'가 아닌 'variable') 만 반환했습니다.

get_func_args () 및 get_func_arg (), $ {}-constructs 및 key ()를 아직 사용하지 않았지만 실패 할 것으로 예상됩니다.


1
가장 기본적인 문제는 변수가 아닌 함수에 을 전달한다는 것 입니다. 변수는 일시적이며 범위에 따라 다릅니다. 종종 변수 이름이 값을 캐시하려는 키가 아닐 수도 있으며, 종종 예제에서와 같이 다른 이름의 변수로 복원합니다. 변수를 기억하기 위해 키 이름을 반복하기에 너무 게으른 경우를 사용하십시오 . cacheVariable(compact('color'))
deceze

1

나는 이것을 가지고있다:

  debug_echo(array('$query'=>$query, '$nrUsers'=>$nrUsers, '$hdr'=>$hdr));

나는 이것을 선호한다 :

  debug_echo($query, $nrUsers, $hdr);

기존 함수는 빨간색 윤곽선이있는 노란색 상자를 표시하고 각 변수를 이름과 값으로 표시합니다. 배열 솔루션은 작동하지만 필요할 때 타이핑하기에는 약간 복잡합니다.

그것은 내 유스 케이스이며 예, 디버깅과 관련이 있습니다. 나는 그렇지 않으면 그 사용에 의문을 가진 사람들에 동의합니다.


1

여기에 내 솔루션이 있습니다. Jeremy Ruten

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')
);

0

간단한 함수를 만들어서 말해 보지 않겠습니까?

/**
 * 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' );

0

나는 이것을 찾고 있었지만 이름을 전달하기로 결정했습니다. 어쨌든 일반적으로 클립 보드에 이름이 있습니다.

function VarTest($my_var,$my_var_name){
    echo '$'.$my_var_name.': '.$my_var.'<br />';
}

$fruit='apple';
VarTest($fruit,'fruit');

0

이것을 달성하기 위해 compact ()를 사용할 수 있습니다.

$FooBar = "a string";

$newArray = compact('FooBar');

변수 이름을 키로 사용하여 연관 배열을 만듭니다. 그런 다음 필요한 키 이름을 사용하여 배열을 반복 할 수 있습니다.

foreach($newarray as $key => $value) {
    echo $key;
}

2
근사하지만 변수를 사용하려면 변수의 이름을 알아야합니다. OP는 프로그래밍 방식으로 변수 이름을 결정하려고합니다.
코더

0

변수 이름을 값으로 알고 싶다고 생각합니다. 이를 위해 연관 배열을 사용할 수 있습니다.

배열 키에 변수 이름을 사용하십시오.

$vars = array('FooBar' => 'a string');

변수 이름을 얻으려면을 사용 array_keys($vars)하면 배열 $vars에서 키로 사용 된 변수 이름의 배열을 반환 합니다.


변수를 선언하는 일반적인 방법보다 훨씬 느립니다.
David Spector

0

나는 이것이 오래되었고 이미 대답했지만 실제로 이것을 찾고있었습니다. 이 답변을 게시하여 사람들이 약간의 답변을 수정하는 시간을 절약 할 수 있습니다.

옵션 1:

$data = array('$FooBar');  

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

$varname = key(compact($vars));  
echo $varname;

인쇄물:

푸바

어떤 이유로 든 이런 상황에 처하게되면 실제로 작동합니다.

.
옵션 2 :

$FooBar = "a string";  

$varname = trim(array_search($FooBar, $GLOBALS), " \t.");  
echo $varname;

경우 $FooBar고유 한 값을 가지고, 그것은 '는 foobar'를 인쇄합니다. 만약$FooBar 비어 있거나 널 (null)이 발견 한 첫 번째 빈 또는 널 (null) 문자열의 이름을 인쇄합니다.

다음과 같이 사용할 수 있습니다.

if (isset($FooBar) && !is_null($FooBar) && !empty($FooBar)) {
    $FooBar = "a string";
    $varname = trim(array_search($FooBar, $GLOBALS), " \t.");
}

0

이것이 내가 한 방식입니다

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 7 버전에서 버그로 인해 제대로 작동하지 않습니다 array_search$GLOBALS그러나 다른 모든 버전은 작동합니다.

https://3v4l.org/UMW7V 참조


-1

이것을 사용하여 사용자 변수를 전역에서 분리하여 현재 변수를 확인하십시오.

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 ; 
    }
}

@IMSoP 출력 결과로 판단하면 print implode( ' ', array_keys( $GLOBALS ));"기본"전역 수에 대한 잘못된 가정처럼 보입니다. 내 시스템에는 $ _GET, $ _POST, $ _COOKIE, $ _FILES, $ _ENV, $ _REQUEST, $ _SERVER의 7 가지 슈퍼 글로벌이 있습니다. 그리고 argv와 argc도 있습니다. 따라서 오프셋은 9가되어야합니다. 기본값은 어쨌든 배열의 끝까지 만 실행되므로 세 번째 매개 변수 (길이)를 지정할 필요가 없습니다.
Jeff

-2

빠르고 더러운 것으로 간주 될 수 있지만, 개인적으로 선호하는 것은 다음과 같은 기능 / 방법을 사용하는 것입니다.

public function getVarName($var) {      
  $tmp = array($var => '');
  $keys = array_keys($tmp);
  return trim($keys[0]);
}

기본적으로 이름을 원하는 변수를 키로 사용하여 하나의 null / 비어있는 요소를 포함하는 연관 배열을 만듭니다.

그런 다음 array_keys를 사용하여 해당 키의 값을 가져와 반환합니다.

분명히 이것은 지저분 해지고 생산 환경에서는 바람직하지 않지만 제시된 문제에는 효과적입니다.


1
변수의 이름이 아니라 변수의 값입니다. 다른 곳에서 지적했듯이 이름은 기능 경계를 넘어 이식 할 수 없습니다.
Owen Beresford

3
이 함수는 말 그대로 trim ($ var);
Alexar

-3

변수 이름을 얻기 위해 전역을 사용해야하는 이유는 다음과 같습니다.

    $variableName = "ajaxmint";

    echo getVarName('$variableName');

    function getVarName($name) {
        return str_replace('$','',$name);
    }

6
OP는 변수 이름을 모르기 때문에. 그가했다면, getVarName()기능이 필요 없을 것 입니다. ;-)
FtDRbwLXw6

1
변수가 아닌 문자열이기 때문에 변수 이름을 문자열로 반환하지 않습니다 '$variableName'. 이 트릭을 함께 할 수 있다면 getVarName($variableName);, 당신은 upvote에 :) 얻을
다니엘 W.

-4

실제로 유스 케이스를 보지 못합니다 ... print_var_name ($ foobar)를 입력하면 print ( "foobar")를 입력하는 것이 너무 어려우신가요?

함수에서 이것을 사용하더라도 변수의 로컬 이름을 얻을 수 있기 때문에 ...

어쨌든 여기에 필요한 것이있는 경우 리플렉션 매뉴얼 이 있습니다.


Print ( "foobar")는 다른 변수를 처리하지 않습니다.
게리 윌로우 비

7
사용 사례 : 코드에 동일한 값을 덤프하는 디버그 지점이 거의 없습니다. 어느 것이 먼저 실행되었는지 어떻게 알 수 있습니까? 라벨 인쇄는 매우 유용합니다.
takeshin March

그런 다음 충분한 프로그래밍을 수행하지 않았습니다. 내가 접한 대부분의 언어에는 일반적으로 간단한 방법이 있습니다.
b01

@ b01 많이 했어. 나는 이것을 허용하는 많은 언어가 있다는 것을 완벽하게 알고 있지만 그 자체로는 그다지 의미가 없습니다. 많은 언어가 쉽게 갈 수있는 방법을 제공하므로 적절한 흐름 제어를 작성하기 위해 언어를 사용해야하는 것은 아닙니다. 이것은 내 견해와 비슷한 경우입니다. 정당한 사례가 있는지 의심 할 여지가 없기 때문에 적절한 사용 사례가 궁금합니다.
Vinko Vrsalovic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.