php运算符opcode 2

本文深入剖析了为何在软件开发领域,大多数程序员未能晋升为架构师的原因,从技术积累、思维方式到项目管理等多个维度进行详细解析。

2 . ===(调用is_identical_function),!==(调用is_not_identical_function -> is_identical_function )

<?php
$i = 1;
$j = 1.0;
echo $i === $j;

//opcode

line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   ASSIGN                                                   !0, 1
   4     1      ASSIGN                                                   !1, 1
   6     2      IS_IDENTICAL                                     ~2      !0, !1
         3      ECHO                                                     ~2
   7     4    > RETURN                                                   1

//调用is_identical_function

 

Z_TYPE_P(result) = IS_BOOL;
    if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {//首先比较类型,如果类型不同,直接返回false
        Z_LVAL_P(result) = 0;
        return SUCCESS;
    }
    switch (Z_TYPE_P(op1)) {
        case IS_NULL:  //null
            Z_LVAL_P(result) = 1;
            break;
        case IS_BOOL:
        case IS_LONG:
        case IS_RESOURCE://bool 整形,资源
            Z_LVAL_P(result) = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
            break;
        case IS_DOUBLE://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;

转载于:https://my.oschina.net/clearchen/blog/75854

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值