typedef struct _zval_struct zval;
struct _zval_struct { /* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
这是php变量存储结构,php变量类型可以转化。
那么我想问的是两个变量相等的条件是什么? 存储的value相等就可以了嘛?<?php $str1 = null;
$str2 = false;
echo $str1 == $str2 ? '相等' : '不相等'; //相等<?php $str1 = '';
$str2 = 0;
echo $str1 == $str2 ? '相等' : '不相等'; //相等<?php $str1 = 0;
$str2 = '0';
echo $str1 === $str2 ? '相等' : '不相等'; //不相等这三个 我有点混乱 ,能不能给我解释一下?谢谢各位
巴扎黑2017-02-10 11:24:03
全等===比较函数
ZEND_API int ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2) /* {{{ */{ if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) { return 0;
} switch (Z_TYPE_P(op1)) { case IS_NULL: case IS_FALSE: case IS_TRUE: return 1; case IS_LONG: return (Z_LVAL_P(op1) == Z_LVAL_P(op2)); case IS_RESOURCE: return (Z_RES_P(op1) == Z_RES_P(op2)); case IS_DOUBLE: return (Z_DVAL_P(op1) == Z_DVAL_P(op2)); case IS_STRING: return (Z_STR_P(op1) == Z_STR_P(op2) ||
(Z_STRLEN_P(op1) == Z_STRLEN_P(op2) && memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0)); case IS_ARRAY: return (Z_ARRVAL_P(op1) == Z_ARRVAL_P(op2) ||
zend_hash_compare(Z_ARRVAL_P(op1), Z_ARRVAL_P(op2), (compare_func_t) hash_zval_identical_function, 1) == 0); case IS_OBJECT: return (Z_OBJ_P(op1) == Z_OBJ_P(op2) && Z_OBJ_HT_P(op1) == Z_OBJ_HT_P(op2)); default: return 0;
}
}
很明显是先比较动态类型, 类型不一致,直接返回0.类型一致,再比较值
普通比较==函数
代码太长,就不贴了, 按照你的例子, 操作数1是字符串, 操作数2是数字, 会把操作数1转成数字再比较.代码片断:
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);converted = 1;
普通比较==的比较规则如下图: