3

我们有一个比较运算符,它有一个运算符'==='。有人可以指导,首先评估的是“类型”还是价值平等?

4

4 回答 4

7

先输入

首先是类型检查。如果不先将它们都转换为相同的类型,就不可能比较不同类型的变量。

于 2012-11-02T07:56:07.280 回答
5

我认为它是类型,因为===没有转换就相等,但有时值的编码相同,如“0”和“false”。As 0 !== false 我认为首先测试的是类型。

根据源代码

ZEND_API int is_identical_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
{
  Z_TYPE_P(result) = IS_BOOL;
  if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
     Z_LVAL_P(result) = 0;
     return SUCCESS;
  }
  /*then value check*/
于 2012-11-02T07:56:18.887 回答
2

当然是类型,通常当您使用==运算符时,

  1. 它将首先检查类型,如果它们不同,它将其中一个转换为相同,
  2. 然后它将检查值是否相等,

所以总是首先评估类型。

编辑

参考 下面的artragis答案是is_identical_functionphp 5.4.8的完整源代码(感谢artragis)

ZEND_API int is_identical_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
    {
        Z_TYPE_P(result) = IS_BOOL;
        if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
            Z_LVAL_P(result) = 0;
            return SUCCESS;
        }
        switch (Z_TYPE_P(op1)) { // here it will check the Type and below it will check the value
            case IS_NULL:
                Z_LVAL_P(result) = 1;
                break;
            case IS_BOOL:
            case IS_LONG:
            case IS_RESOURCE:
                Z_LVAL_P(result) = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
                break;
            case IS_DOUBLE:
                Z_LVAL_P(result) = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
                break;
            case IS_STRING:
                Z_LVAL_P(result) = ((Z_STRLEN_P(op1) == Z_STRLEN_P(op2))
                    && (!memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1))));
                break;
            case IS_ARRAY:
                Z_LVAL_P(result) = (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 TSRMLS_CC)==0);
                break;
            case IS_OBJECT:
                if (Z_OBJ_HT_P(op1) == Z_OBJ_HT_P(op2)) {
                    Z_LVAL_P(result) = (Z_OBJ_HANDLE_P(op1) == Z_OBJ_HANDLE_P(op2));
                } else {
                    Z_LVAL_P(result) = 0;
                }
                break;
            default:
                Z_LVAL_P(result) = 0;
                return FAILURE;
        }
        return SUCCESS;
    }
于 2012-11-02T07:57:54.083 回答
-1

操作员检查内部对象 id 是否相同。说,你有 2 个 class Foo { var $bar = 0} 的实例,即使对象是相同的类型,并且具有相同的值,它们也不是同一个对象,因此 === 将返回 false。

对于原语,类型和值都必须完全相同。顺序无所谓。这是逻辑与。

于 2012-11-02T07:59:03.507 回答