コードをコピーします コードは次のとおりです:
/**
* 変数名を取得します
*
* @param $string
*
* $test = "helo"
* $test2 = "helo"
;*/
function getVarName(&$src){
//現在の変数値を保存します
$save = $src; //すべての変数を保存します Value
$allvar = $GLOBALS;
//関数内で $GLOBALS を直接走査しないでください。スタックの問題が発生します
foreach($allvar as $k=>$v){
//変数値は同じですが、同じ変数ではない可能性があります。複数の変数の値が同じである可能性があるためです
if ($src == $v){
//現在の変数の値を変更します $ src
$src = 'change';
//$GLOBALS[$k] も変更されるので、同じ変数です。
if ($src == $GLOBALS[$k]){
//echo "$$k の名前は $k です"
//変数の値を復元します
$src = $save
}
}
}
}
コピーしてみたら、テスト結果は正しい場合もあれば間違っている場合もあることに気づきました。 長い間考えた結果、非常に単純ではありますが、記録しました。同じ状況に遭遇した学生には注意してほしいと思います。
例: 今テスト中です
$test2 = "hello"; echo getVarName($test2);論理的には出力は "test2" であるはずですが、出力は "countNum" になります。 $src="hello" など、関数内の if ($src == $v) に問題があるため、
は $GLOBALS の変数 $countNUm=0 です。
このとき、ループ中に ($src == $v) が判定された場合、つまり "hello" == 0 であれば、比較結果は true となり、型中に変換すると、「hello」は整数値 0 に変換されます。
ループを終了すると、間違った結果が得られます。
1 つの解決策は、if ($src == $v) を if ($src===$v) に変更することですが、これは同じです。
私の理解が間違っている場合は、修正していただいて、一緒に進歩していきましょう。