PHP文字列比較

2522 ワード

コードで最も多く使用されている論理は何ですか?
次のコードのブール結果がそれぞれ何なのか知っていますか.
var_dump("1" == "1e0");
var_dump("1" == "0x1");
var_dump("20" == "2e1");
var_dump("10" == "  0x0a");

など;はい、PHPマニュアルの付録にこの問題についてのまとめがあると言うかもしれません.問題は、これはただその然を知っているだけで、それでは何ですか?今日、あるネットユーザーが私に質問しました.
var_dump("1" == "1e0");  //true
var_dump("1" == "1ef"); //false
             .

すなわち、上記の式aが成立するには、PHPが二発ともintとして比較するという唯一の解釈である.でも、var_dump("1 e 0")、またはvar_dump("1")は、stringですね.では、PHPはどのように比較する2つのタイプを決めるのでしょうか.それとも、従来の方法で、zend_language_scanner.lから==のopcodeコードを見つけてT_IS_EQUALになり、zend_language_parse.yでコンパイラを見つけてT_IS_EQUALを見たらどうなりますか.
expr T_IS_EQUAL expr            { zend_do_binary_op(ZEND_IS_EQUAL, &$$, &$1, &$3 TSRMLS_CC); }

では、次はzend_vm_def.hでZEがZEND_IS_EQUALに出会ったら何をするかを探します.
ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
     {
          zend_op *opline = EX(opline);
          zend_free_op free_op1, free_op2;
 
          is_equal_function(&EX_T(opline->result.u.var).tmp_var,
               GET_OP1_ZVAL_PTR(BP_VAR_R),
               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
          FREE_OP1();
          FREE_OP2();
          ZEND_VM_NEXT_OPCODE();
     }

ああ、そうではありません.compare_functionコードが長すぎて貼られていません.compare_functionでは、2つの比較操作数がstringの場合、zendi_smart_strcmpが呼び出されます.
if (op1->type == IS_STRING && op2->type == IS_STRING) {
        zendi_smart_strcmp(result, op1, op2);
        COMPARE_RETURN_AND_FREE(SUCCESS);
    }

zendi_smart_strcmpでは、2つの文字列について、まずnumeric_stringかどうかを判断し、もしそうであれば整形に変換して比較する..ではnumeric stringとは何か?PHPはタイプを区別しないので、彼女は1つの戦略を採用して、あなたの変量が1つの数字に見えるとき、彼女はこの変数が1つの数字だと思っています.簡単に言えば、numeric_stringとは、数字を表す文字列です.つまり、次のような比較結果が真実です.
var_dump("1" == "1e0");
var_dump("1" == "0x1");
var_dump("20" == "2e1");
var_dump("10" == "  0x0a");

ほほほ、読者たちはこの問題に困ったことがありますか?
if("608E-4234" == "272E-3063"){
	echo "oh shit! they're equal!
"; }else{ echo "obviously, isn't?
"; }

PHP開発Tips:2つの文字列が等しいかどうかを判断するには、==ではなく==を使用します.
作者:Laruence
本住所:http://www.laruence.com/2009/02/21/662.html