복붙노트

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

PHP

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

PHP 코드가 있다고 가정 해 보겠습니다.

$FooBar = "a string";

다음과 같은 함수가 필요합니다.

print_var_name($FooBar);

어떤 인쇄 :

FooBar

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

해결법

  1. ==============================

    1.get_defined_vars ()를 사용하여 이름을 찾으려는 변수와 동일한 값을 갖는 변수의 이름을 찾을 수 있습니다. 분명히 이것은 항상 작동하지 않을 것입니다. 왜냐하면 다른 변수는 종종 같은 값을 갖기 때문입니다. 그러나 이것을 생각할 수있는 유일한 방법입니다.

    get_defined_vars ()를 사용하여 이름을 찾으려는 변수와 동일한 값을 갖는 변수의 이름을 찾을 수 있습니다. 분명히 이것은 항상 작동하지 않을 것입니다. 왜냐하면 다른 변수는 종종 같은 값을 갖기 때문입니다. 그러나 이것을 생각할 수있는 유일한 방법입니다.

    편집 : get_defined_vars () 올바르게 작동하지 않는 것, 그것은 var 자체를 함수에 $ var 사용되기 때문에 'var'반환합니다. $ GLOBALS가 작동하는 것처럼 보였으므로 변경되었습니다.

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

    편집 : 분명히하기 위해, PHP에서 이것을 수행하는 좋은 방법이 없다. 아마도 그렇게하지 않아도되기 때문일 것이다. 당신이하려는 일을하는 데 더 좋은 방법이있을 것입니다.

  2. ==============================

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

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

    어깨를 으하다

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

    함수를 호출 한 함수를 호출 한 행을 기반으로 작동합니다. 여러 인자로 작업 할 수 있도록 확장 할 수 있다고 가정하지만, 다른 사람들이 말했듯이 상황을 더 잘 설명 할 수 있다면 다른 해결책이 될 수 있습니다. 더 잘 작동합니다.

  3. ==============================

    3.접근 방식을 변경하고 가변 변수 이름을 사용하는 것이 좋습니다.

    접근 방식을 변경하고 가변 변수 이름을 사용하는 것이 좋습니다.

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

    그럼 그냥 할 수있어.

    print($var_name);
    

    도착

    FooBar
    

    변수 변수에 대한 PHP 매뉴얼 링크

  4. ==============================

    4.아무도 이것이 a) hard와 b) 현명하지 못한 근본적인 이유를 언급 한 것 같습니다.

    아무도 이것이 a) hard와 b) 현명하지 못한 근본적인 이유를 언급 한 것 같습니다.

    지금, 나는 디버깅을위한 욕망을 이해하고있다. (비록 제안 된 사용법 중 일부는 그 이상이다.) 그러나 일반화 된 솔루션으로 생각하면 실제로 도움이되지 않는다. 디버그 함수가 변수가 "$ file ", 그것은 여전히 ​​당신의 코드에서 수십개의"$ file "변수들 중 하나이거나 당신이"$ filename "이라고 불렀지 만 매개 변수가"$ file "이라 불리는 함수로 넘겨주는 변수 일 수 있습니다.

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

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

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

    5.디버깅 이유로 검사 기능을 만들었습니다. 스테로이드의 경우 print_r ()과 비슷하지만 Krumo와 매우 유사하지만 대상에 조금 효과적입니다. var 이름 검색 기능을 추가하고이 페이지에서 Nick Presta의 게시물에 영감을 받아이 기능을 사용했습니다. 변수 이름뿐만 아니라 인수로 전달 된 식을 감지합니다.

    디버깅 이유로 검사 기능을 만들었습니다. 스테로이드의 경우 print_r ()과 비슷하지만 Krumo와 매우 유사하지만 대상에 조금 효과적입니다. var 이름 검색 기능을 추가하고이 페이지에서 Nick Presta의 게시물에 영감을 받아이 기능을 사용했습니다. 변수 이름뿐만 아니라 인수로 전달 된 식을 감지합니다.

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

    이 잘 작동합니다.  죽어라. (inspect ($ this-> getUser () -> hasCredential ( "delete")

  6. ==============================

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

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

    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

  7. ==============================

    7.php.net에서

    php.net에서

    @ 알렉산드르 - 짧은 해결책

    <?php
    function vname(&$var, $scope=0)
    {
        $old = $var;
        if (($key = array_search($var = 'unique'.rand().'value', !$scope ? $GLOBALS : $scope)) && $var = $old) return $key;  
    }
    ?>
    

    @Lucas - 사용법

    <?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
    ?>
    
  8. ==============================

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

    많은 답장이 이것의 유용성에 의문을 제기합니다. 그러나 변수에 대한 참조를 얻는 것은 매우 유용 할 수 있습니다. 특히 객체와 $ 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
    
  9. ==============================

    9.이것은 정확히 당신이 원하는 것입니다 - 주어진 var의 이름을 반향시키는 "copy and drop in"함수를 사용할 준비가되었습니다 :

    이것은 정확히 당신이 원하는 것입니다 - 주어진 var의 이름을 반향시키는 "copy and drop in"함수를 사용할 준비가되었습니다 :

    function print_var_name(){
        // read backtrace
        $bt   = debug_backtrace();
        // read file
        $file = file($bt[0]['file']);
        // select exact debug($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

  10. ==============================

    10.많은 변수에 대해 위의 응답에서 성능이 좋고 하나의 $ GLOBALS가 많은 것을 스캔합니다.

    많은 변수에 대해 위의 응답에서 성능이 좋고 하나의 $ 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
            )
    
    )
    
  11. ==============================

    11.변수가 상호 교환 가능하면 어떤 변수가 사용되는지를 결정하는 어딘가에 로직이 있어야합니다. 당신이해야 할 일은 그 밖의 모든 일을하는 동안 변수 이름을 그 로직 안에있는 변수에 넣는 것뿐입니다.

    변수가 상호 교환 가능하면 어떤 변수가 사용되는지를 결정하는 어딘가에 로직이 있어야합니다. 당신이해야 할 일은 그 밖의 모든 일을하는 동안 변수 이름을 그 로직 안에있는 변수에 넣는 것뿐입니다.

    나는 우리가 너를 위해 필요한 것을 이해하는 데 어려움을 겪고 있다고 생각한다. 샘플 코드 또는 실제로 시도한 내용에 대한 설명이 도움이 될 수 있지만, 나는 당신이 이것을 지나치게 생각하는 방식이라고 생각합니다.

  12. ==============================

    12.사실이 경우에 유효한 유스 케이스가 있습니다.

    사실이 경우에 유효한 유스 케이스가 있습니다.

    나는 함수 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));
    }
    

    하지만 이것도 실패합니다 ... :(

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

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

    나는 아직 get_func_args ()와 get_func_arg (), $ {} - 구조체와 key ()를 조합하여 사용하지는 않았지만 실패 할 것으로 추정한다.

  13. ==============================

    13.나는 이것을 가지고있다:

    나는 이것을 가지고있다:

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

    나는 이것을 선호 할 것이다.

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

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

    그것은 나의 유스 케이스이고 예, 디버깅과 관련이 있습니다. 그렇지 않으면 그 사용에 대해 질문하는 사람들과 동의합니다.

  14. ==============================

    14.간단한 함수를 작성하고 알려주시겠습니까?

    간단한 함수를 작성하고 알려주시겠습니까?

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

    15.Jeremy Ruten을 기반으로 한 내 솔루션입니다.

    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')
    );
    
  16. ==============================

    16.나는 이것을 찾고 있었지만 이름을 전달하기로 결심했다. 보통 어쨌든 클립 보드에 이름이있다.

    나는 이것을 찾고 있었지만 이름을 전달하기로 결심했다. 보통 어쨌든 클립 보드에 이름이있다.

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

    17.나는 그것이 가치있는 변수 이름을 알고 싶어한다고 생각합니다. 이를 달성하기 위해 연관 배열을 사용할 수 있습니다.

    나는 그것이 가치있는 변수 이름을 알고 싶어한다고 생각합니다. 이를 달성하기 위해 연관 배열을 사용할 수 있습니다.

    배열 키에 변수 이름 사용 :

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

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

    이 방법을 사용하여 데이터베이스 클래스의 테이블 열 이름을 가져옵니다.

  18. ==============================

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

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

        $variableName = "ajaxmint";
    
        echo getVarName('$variableName');
    
        function getVarName($name) {
            return str_replace('$','',$name);
        }
    
  19. ==============================

    19.이 변수를 사용하여 사용자 변수를 전역 변수에서 분리하여 변수를 즉시 확인합니다.

    이 변수를 사용하여 사용자 변수를 전역 변수에서 분리하여 변수를 즉시 확인합니다.

    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 ; 
        }
    }
    
  20. ==============================

    20.빠르고 더러운 것으로 간주 될지 모르지만 내 개인적인 취향은 다음과 같은 함수 / 메소드를 사용하는 것입니다.

    빠르고 더러운 것으로 간주 될지 모르지만 내 개인적인 취향은 다음과 같은 함수 / 메소드를 사용하는 것입니다.

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

    기본적으로 하나의 null / empty 요소를 포함하는 연관 배열을 만들고 이름으로 사용할 변수를 키로 사용합니다.

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

    분명히 이것은 지저분 해지며 프로덕션 환경에서는 바람직하지 않지만 제시된 문제에 효과적입니다.

  21. ==============================

    21.이를 위해 compact ()를 사용할 수 있습니다.

    이를 위해 compact ()를 사용할 수 있습니다.

    $FooBar = "a string";
    
    $newArray = compact('FooBar');
    

    그러면 변수 이름을 키로하는 연관 배열이 만들어집니다. 그런 다음 필요할 때 키 이름을 사용하여 배열을 반복 할 수 있습니다.

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

    22.나는 실제로 유즈 케이스를 보지 못한다. print_var_name ($ foobar)을 입력하면 print ( "foobar")를 타이핑하는 것에 대해 무엇이 어렵고 다른가?

    나는 실제로 유즈 케이스를 보지 못한다. print_var_name ($ foobar)을 입력하면 print ( "foobar")를 타이핑하는 것에 대해 무엇이 어렵고 다른가?

    왜냐하면 당신이 함수에서 이것을 사용했다 할지라도 변수의 로컬 이름을 얻게 될 것이기 때문입니다 ...

    어쨌든 여기서 반성 매뉴얼이 있습니다. 거기에 필요한 것이 있습니다.

  23. from https://stackoverflow.com/questions/255312/how-to-get-a-variable-name-as-a-string-in-php by cc-by-sa and MIT license