ホームページ  >  記事  >  バックエンド開発  >  変数名 PHP の変数の変数名を取得するコードのバグ分析

変数名 PHP の変数の変数名を取得するコードのバグ分析

WBOY
WBOYオリジナル
2016-07-29 08:46:00921ブラウズ

コードをコピーします コードは次のとおりです:


/**
* 変数名を取得します
*
* @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) に変更することですが、これは同じです。
私の理解が間違っている場合は、修正していただいて、一緒に進歩していきましょう。

上記は、PHP で変数の変数名を取得するコードのバグ分析を変数名も含めて紹介しました。PHP チュートリアルに興味のある友人の参考になれば幸いです。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。