PHP에서 변수 이름을 문자열로 가져 오는 방법은 무엇입니까?
PHPPHP에서 변수 이름을 문자열로 가져 오는 방법은 무엇입니까?
PHP 코드가 있다고 가정 해 보겠습니다.
$FooBar = "a string";
다음과 같은 함수가 필요합니다.
print_var_name($FooBar);
어떤 인쇄 :
FooBar
어떤 아이디어가 이것을 달성하는 방법? PHP에서도 가능합니까?
해결법
-
==============================
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.나는 이것을 효율적으로하는 방법을 생각할 수 없었다. 그러나 나는 이것을 생각해 냈다. 아래의 제한된 용도로 작동합니다.
나는 이것을 효율적으로하는 방법을 생각할 수 없었다. 그러나 나는 이것을 생각해 냈다. 아래의 제한된 용도로 작동합니다.
어깨를 으하다
<?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.접근 방식을 변경하고 가변 변수 이름을 사용하는 것이 좋습니다.
접근 방식을 변경하고 가변 변수 이름을 사용하는 것이 좋습니다.
$var_name = "FooBar"; $$var_name = "a string";
그럼 그냥 할 수있어.
print($var_name);
도착
FooBar
변수 변수에 대한 PHP 매뉴얼 링크
-
==============================
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.디버깅 이유로 검사 기능을 만들었습니다. 스테로이드의 경우 print_r ()과 비슷하지만 Krumo와 매우 유사하지만 대상에 조금 효과적입니다. var 이름 검색 기능을 추가하고이 페이지에서 Nick Presta의 게시물에 영감을 받아이 기능을 사용했습니다. 변수 이름뿐만 아니라 인수로 전달 된 식을 감지합니다.
디버깅 이유로 검사 기능을 만들었습니다. 스테로이드의 경우 print_r ()과 비슷하지만 Krumo와 매우 유사하지만 대상에 조금 효과적입니다. var 이름 검색 기능을 추가하고이 페이지에서 Nick Presta의 게시물에 영감을 받아이 기능을 사용했습니다. 변수 이름뿐만 아니라 인수로 전달 된 식을 감지합니다.
이것은 전달 된 표현식을 감지하는 래퍼 함수입니다. 대부분의 경우에 작동합니다. 동일한 코드 행에서 두 번 이상 함수를 호출하면 작동하지 않습니다.
이 잘 작동합니다. 죽어라. (inspect ($ this-> getUser () -> hasCredential ( "delete")
-
==============================
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.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.많은 답장이 이것의 유용성에 의문을 제기합니다. 그러나 변수에 대한 참조를 얻는 것은 매우 유용 할 수 있습니다. 특히 객체와 $ 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.이것은 정확히 당신이 원하는 것입니다 - 주어진 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.많은 변수에 대해 위의 응답에서 성능이 좋고 하나의 $ 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.변수가 상호 교환 가능하면 어떤 변수가 사용되는지를 결정하는 어딘가에 로직이 있어야합니다. 당신이해야 할 일은 그 밖의 모든 일을하는 동안 변수 이름을 그 로직 안에있는 변수에 넣는 것뿐입니다.
변수가 상호 교환 가능하면 어떤 변수가 사용되는지를 결정하는 어딘가에 로직이 있어야합니다. 당신이해야 할 일은 그 밖의 모든 일을하는 동안 변수 이름을 그 로직 안에있는 변수에 넣는 것뿐입니다.
나는 우리가 너를 위해 필요한 것을 이해하는 데 어려움을 겪고 있다고 생각한다. 샘플 코드 또는 실제로 시도한 내용에 대한 설명이 도움이 될 수 있지만, 나는 당신이 이것을 지나치게 생각하는 방식이라고 생각합니다.
-
==============================
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.나는 이것을 가지고있다:
나는 이것을 가지고있다:
debug_echo(array('$query'=>$query, '$nrUsers'=>$nrUsers, '$hdr'=>$hdr));
나는 이것을 선호 할 것이다.
debug_echo($query, $nrUsers, $hdr);
기존 함수는 빨간색 윤곽선이있는 노란색 상자를 표시하고 각 변수를 이름과 값으로 표시합니다. 배열 솔루션은 작동하지만 필요하면 입력 할 때 다소 복잡합니다.
그것은 나의 유스 케이스이고 예, 디버깅과 관련이 있습니다. 그렇지 않으면 그 사용에 대해 질문하는 사람들과 동의합니다.
-
==============================
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.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.나는 이것을 찾고 있었지만 이름을 전달하기로 결심했다. 보통 어쨌든 클립 보드에 이름이있다.
나는 이것을 찾고 있었지만 이름을 전달하기로 결심했다. 보통 어쨌든 클립 보드에 이름이있다.
function VarTest($my_var,$my_var_name){ echo '$'.$my_var_name.': '.$my_var.'<br />'; } $fruit='apple'; VarTest($fruit,'fruit');
-
==============================
17.나는 그것이 가치있는 변수 이름을 알고 싶어한다고 생각합니다. 이를 달성하기 위해 연관 배열을 사용할 수 있습니다.
나는 그것이 가치있는 변수 이름을 알고 싶어한다고 생각합니다. 이를 달성하기 위해 연관 배열을 사용할 수 있습니다.
배열 키에 변수 이름 사용 :
$vars = array('FooBar' => 'a string');
변수 이름을 얻고 자 할 때 array_keys ($ vars)를 사용하면 $ vars 배열에서 키로 사용 된 변수 이름의 배열을 반환합니다.
이 방법을 사용하여 데이터베이스 클래스의 테이블 열 이름을 가져옵니다.
-
==============================
18.변수 이름을 얻기 위해 전역 변수를 사용해야하는 이유는 다음과 같습니다.
변수 이름을 얻기 위해 전역 변수를 사용해야하는 이유는 다음과 같습니다.
$variableName = "ajaxmint"; echo getVarName('$variableName'); function getVarName($name) { return str_replace('$','',$name); }
-
==============================
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.빠르고 더러운 것으로 간주 될지 모르지만 내 개인적인 취향은 다음과 같은 함수 / 메소드를 사용하는 것입니다.
빠르고 더러운 것으로 간주 될지 모르지만 내 개인적인 취향은 다음과 같은 함수 / 메소드를 사용하는 것입니다.
public function getVarName($var) { $tmp = array($var => ''); $keys = array_keys($tmp); return trim($keys[0]); }
기본적으로 하나의 null / empty 요소를 포함하는 연관 배열을 만들고 이름으로 사용할 변수를 키로 사용합니다.
그런 다음 array_keys를 사용하여 해당 키의 값을 가져 와서 반환합니다.
분명히 이것은 지저분 해지며 프로덕션 환경에서는 바람직하지 않지만 제시된 문제에 효과적입니다.
-
==============================
21.이를 위해 compact ()를 사용할 수 있습니다.
이를 위해 compact ()를 사용할 수 있습니다.
$FooBar = "a string"; $newArray = compact('FooBar');
그러면 변수 이름을 키로하는 연관 배열이 만들어집니다. 그런 다음 필요할 때 키 이름을 사용하여 배열을 반복 할 수 있습니다.
foreach($newarray as $key => $value) { echo $key; }
-
==============================
22.나는 실제로 유즈 케이스를 보지 못한다. print_var_name ($ foobar)을 입력하면 print ( "foobar")를 타이핑하는 것에 대해 무엇이 어렵고 다른가?
나는 실제로 유즈 케이스를 보지 못한다. print_var_name ($ foobar)을 입력하면 print ( "foobar")를 타이핑하는 것에 대해 무엇이 어렵고 다른가?
왜냐하면 당신이 함수에서 이것을 사용했다 할지라도 변수의 로컬 이름을 얻게 될 것이기 때문입니다 ...
어쨌든 여기서 반성 매뉴얼이 있습니다. 거기에 필요한 것이 있습니다.
from https://stackoverflow.com/questions/255312/how-to-get-a-variable-name-as-a-string-in-php by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP로 비동기 HTTP 요청을하는 법 (0) | 2018.09.05 |
---|---|
print_r ()의 출력에서 변수를 볼 수 있지만 코드에서 액세스하는 방법을 모릅니다. (0) | 2018.09.05 |
PDOException "드라이버를 찾을 수 없습니다" (0) | 2018.09.05 |
PHP curl로 HTTP 기본 인증을 사용하여 요청하는 방법은 무엇입니까? (0) | 2018.09.05 |
PHP를 사용할 때 MySQL 대 MySQLi [닫힘] (0) | 2018.09.05 |