问一个比较基础的问题 php变量类型及其存储结构
巴扎黑
巴扎黑 2017-02-10 11:21:44
[PHP讨论组]

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 ? '相等' : '不相等'; //不相等这三个 我有点混乱 ,能不能给我解释一下?谢谢各位

巴扎黑
巴扎黑

全部回复(1)
巴扎黑

全等===比较函数

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;

普通比较==的比较规则如下图:

89008931-589d2db367067_articlex.png

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号