は、PHP の empty(0)、empty(0.0)、empty('0')、empty('0.0')、empty('00') がそれぞれ何を返すかを尋ねられたので、通常の empty() マニュアルについて説明します。それ自体は非常に明確です:
""、0、"0"、NULL、FALSE、array()、var $var; および属性のないオブジェクトは空とみなされ、var が空の場合は TRUE が返されます。
しかし、empty('00') に関しては混乱しました。私の理解システムでは、empty() は '0' を数値に変換するため、true を返すため、'00' も変換されますか?練習せずに賢く考えて、「00」が false を返すのは、「00」が数値に変換されず、空でない文字列であるため、false であると考えました。
確信が持てなかったので、Google で検索しましたが、この簡単な質問は誰も見つけられなかったので、自分で解決する必要がありました。最初に php
<?phpempty($a);isset($a);
オペコードが見つかりました:
2 0 E > ISSET_ISEMPTY_VAR 293601280 RES[ IS_TMP_VAR ~0 ] OP1[ IS_CV !0 ] OP2[ IS_UNused ]
1 FREE OP1[ IS_TMP_VAR ~0 ]
3 2 ISSET_ISEMPTY_VAR 310378496 RES[ IS_TMP_VAR ~1 ] OP1[ IS_CV !0 ] OP2[ IS_UNused ]
3 FREE OP1[ IS_TMP_VAR ~1 ]
4 4 > RETURN OP1[ IS_CONST (12) 8414056) 1 ]
両方とも ISSET_ISEMPTY_VAR と呼ばれ、zend ソース コードに移動して、実行された操作が ZEND_ISSET_ISEMPTY_VAR (zend_vm_opcodes.c) であることを確認します。次に、ZEND_ISSET_ISEMPTY_VAR を見つけて実行します。実際には、ZEND_ISSET_ISEMPTY_VAR_xxx (zend_vm_execute.h) が実行されます。 )および他の一連の関数は、ソース コードの読み取りを通じて、変数が空かどうかを判断する最終的な実行関数が i_zend_is_true()、
最終的に定義を見つけました: zend_execute.h:static zend_always_inline int i_zend_is_true(zval *op) ;
具体的なコードは次のとおりです:
static zend_always_inline int i_zend_is_true(zval *op){ int result; switch (Z_TYPE_P(op)) { case IS_NULL: result = 0; break; case IS_LONG: case IS_BOOL: case IS_RESOURCE: result = (Z_LVAL_P(op)?1:0); break; case IS_DOUBLE: result = (Z_DVAL_P(op) ? 1 : 0); break; case IS_STRING: if (Z_STRLEN_P(op) == 0 || (Z_STRLEN_P(op)==1 && Z_STRVAL_P(op)[0]=='0')) { result = 0; } else { result = 1; } break; case IS_ARRAY: result = (zend_hash_num_elements(Z_ARRVAL_P(op))?1:0); break; case IS_OBJECT: if(IS_ZEND_STD_OBJECT(*op)) { TSRMLS_FETCH(); if (Z_OBJ_HT_P(op)->cast_object) { zval tmp; if (Z_OBJ_HT_P(op)->cast_object(op, &tmp, IS_BOOL TSRMLS_CC) == SUCCESS) { result = Z_LVAL(tmp); break; } } else if (Z_OBJ_HT_P(op)->get) { zval *tmp = Z_OBJ_HT_P(op)->get(op TSRMLS_CC); if(Z_TYPE_P(tmp) != IS_OBJECT) { /* for safety - avoid loop */ convert_to_boolean(tmp); result = Z_LVAL_P(tmp); zval_ptr_dtor(&tmp); break; } } } result = 1; break; default: result = 0; break; } return result;}
empty() は文字列を判断しています 長さが 0 の場合、まず長さが 0 であるかどうかを判断し、そうであれば 0 を返し、それ以外の場合は長さが 1 で文字が '0' であるかどうかを判断します
isset() に関しては、値が代入されていない場合に戻り、i_zend_is_true() 関数は実行されません。