【php】问一个比较基础的问题 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 ? '相等' : '不相等'; //不相等

这三个 我有点混乱 ,能不能给我解释一下?谢谢各位

回答

看源码更清晰:

全等===比较函数

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;

普通比较==的比较规则如下图:
【php】问一个比较基础的问题 php变量类型及其存储结构

感觉你这个不是变量结构能看明白的,应该是看原算符,看他是怎么运算的
我是php的,但是没有去看过源码的运算符是怎么写的!

null == false == 0 == '' ,这个是php规定的,应该是和弱类型有关,
不过想要强校验 php 提供 === 校验,这个可以这样理解,先找 $str1的类型, 也就是变量结构中,数据具体存在什么地方,然后在做比较,让第二个变量$str2 也从相同的地方去找.

  • == 为等于比较符,仅比较值,在两个值类型不同的情况下,会先进行类型转换,然后再比较值是否相等

  • === 为全等比较符,会比较值和类型,而不会进行类型转换,只有值和类型完全相同,才相等

类型不同时的转换规则:

运算数 1 类型运算数 2 类型结果
null 或 stringstring将 NULL 转换为 "",进行数字或词汇比较
bool 或 null任何其它类型转换为 bool,FALSE < TRUE
objectobject内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明
string,resource 或 numberstring,resource 或 number将字符串和资源转换成数字,按普通数学比较
arrayarray具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例)
object任何其它类型object 总是更大
array任何其它类型array 总是更大

更多参考:http://php.net/manual/zh/language.operators.comparison.php

以上是 【php】问一个比较基础的问题 php变量类型及其存储结构 的全部内容, 来源链接: utcz.com/a/100714.html

回到顶部