ホームページ  >  記事  >  バックエンド開発  >  PHP の空および isset ソース コードの分析

PHP の空および isset ソース コードの分析

WBOY
WBOYオリジナル
2016-06-23 13:12:171088ブラウズ

は、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() は、文字列 ( ) を検出するときに、検出値に対して何も変換を実行しません。私が理解している限り):

empty() は文字列を判断しています 長さが 0 の場合、まず長さが 0 であるかどうかを判断し、そうであれば 0 を返し、それ以外の場合は長さが 1 で文字が '0' であるかどうかを判断します

isset() に関しては、値が代入されていない場合に戻り、i_zend_is_true() 関数は実行されません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。