3

演算子「===」を持つ比較演算子があります。最初に評価されるもの、「タイプ」または値の等価性を誰かが導くことができますか?

4

4 に答える 4

7

最初に入力

まずは型チェック。最初に両方を同じ型にキャストしないと、異なる型の変数を比較することはできません。

于 2012-11-02T07:56:07.280 に答える
5

===変換せずに equalty を行うので型だと思いますが、値が「0」と「false」のように同じようにコード化されることがあります。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

確かに Type です。通常、==operator を使用する場合は、

  1. 最初にタイプをチェックし、それらが異なる場合は、それらの1つを同一に変換します。
  2. 次に、値が等しいかどうかを確認します。

そのため、常にTypeが最初に評価されます。

編集

以下のartragisの回答を参照する と、php 5.4.8の完全なソースコードですis_identical_function(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 が同じかどうかをチェックします。クラス Foo { var $bar = 0} のインスタンスが 2 つあるとします。オブジェクトが同じ型で同じ値を持っていても、それらは同じオブジェクトではないため、=== は false を返します。

プリミティブの場合、型と値の両方がまったく同じでなければなりません。順序は関係ありません。論理積です。

于 2012-11-02T07:59:03.507 に答える