ホームページ > バックエンド開発 > PHPチュートリアル > PHP_PHP チュートリアルで変数の変数名を取得するコードのバグ分析

PHP_PHP チュートリアルで変数の変数名を取得するコードのバグ分析

WBOY
リリース: 2016-07-21 15:26:55
オリジナル
918 人が閲覧しました

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

/**
* 変数名を取得します
*
* @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" です。 関数内の
if ($src == $v) に問題があるため、$src="hello" など、 $GLOBALS の変数 $countNUm=0
このとき、ループ中に ($src == $v) と判定された場合、つまり "hello" == 0 であれば、型変換時に比較結果は true となります。 "hello" は整数に変換されて 0 になり、
ループを終了すると、間違った結果が得られます。
1 つの解決策は、if ($src == $v) を if ($src===$v) に変更することですが、これは同じです。
私の理解が間違っている場合は、修正していただいて、一緒に進歩していきましょう。


http://www.bkjia.com/PHPjc/323861.html

www.bkjia.com

tru​​e
http://www.bkjia.com/PHPjc/323861.html

技術記事次のようにコードをコピーします: /*** 変数名を取得します * * @param $string * @return $string * * $test = "helo"; * $test2 = "helo"; * getVarName($test2);*/ function getVarName( //Storage...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート