PHP - 在“===”中首先评估什么?类型或值相等?

时间:2012-11-02 07:51:43

标签: php

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

4 个答案:

答案 0 :(得分:7)

先键入

首先是类型检查。无法比较不同类型的变量,而首先将它们都转换为相同的类型。

答案 1 :(得分:5)

我认为这是类型,因为===在没有转换的情况下执行了相同的操作,但有时值的编码方式与“0”和“false”相同。因为0!== false我认为测试的第一件事就是输入。

根据source code

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*/

答案 2 :(得分:2)

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

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

    修改

    参考artragis回答 下面是is_identical_function php 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;
        }
    

答案 3 :(得分:-1)

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

对于基元,类型和值必须完全相同。订单无关紧要。这是合乎逻辑的。