ホームページ >バックエンド開発 >PHPチュートリアル >PHP で下付き文字 [] を使用して文字列を読み取るロジック

PHP で下付き文字 [] を使用して文字列を読み取るロジック

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

PHP では、 [(subscript)] 記号は配列やオブジェクトだけでなく文字列にも適用される可能性があるため、注意しないと間違いを犯しやすくなります。

たとえば、ネットワーク インターフェイスを取得する場合、通常の状況では解析後の結果は次のようになります:

array('content' => 'This is returned by interface')


インターフェイス データを取得した後、次のステートメントを使用します。コンテンツに値があるかどうかを判断するには、問題が発生します:

if (!empty($result['content']))    echo $result['content'];

サーバーが異常な場合、次の HTML 文字列が返される可能性があります:

<html>    <head>        <title>505</title>    </head>    <body>        Service Internal Error    </body></html>

この場合、次のようにします。上記のステートメントを json_decode 解析すると、A < という文字が得られますが、これはなぜでしょうか?

PHP5.2.5 で文字列に作用する [] のロジックを見てみましょう:

.......        case IS_STRING: {                zval tmp;                 if (dim == NULL) {                    zend_error_noreturn(E_ERROR, "[] operator not supported for strings");                }                    if (Z_TYPE_P(dim) != IS_LONG) {                    switch(Z_TYPE_P(dim)) {                        /* case IS_LONG: */                        case IS_STRING:                        case IS_DOUBLE:                        case IS_NULL:                        case IS_BOOL:                            /* do nothing */                            break;                        default:                            zend_error(E_WARNING, "Illegal offset type");                            break;                    }                        tmp = *dim;                    zval_copy_ctor(&tmp);                    convert_to_long(&tmp);                    dim = &tmp;                }                    switch (type) {                    case BP_VAR_R:                    case BP_VAR_IS:                    case BP_VAR_UNSET:                        /* do nothing... */                        break;                    default:                        SEPARATE_ZVAL_IF_NOT_REF(container_ptr);                        break;                }                    if (result) {                    container = *container_ptr;                    result->str_offset.str = container;                    PZVAL_LOCK(container);                    result->str_offset.offset = Z_LVAL_P(dim);                    result->var.ptr_ptr = NULL;                    if (type == BP_VAR_R || type == BP_VAR_IS) {                        AI_USE_PTR(result->var);                    }                    }                    return;            }                break;...... 
上記のソースコードでは: dim は添え字を意味します

まず、[ に添え字がないかどうかを確認します。 ] 演算子を使用した場合、エラーが報告されます。添え字がない場合、新しい単語配列が追加され、文字列に対して間違いなくエラーが発生するためです。

次に、添字が数値であるかどうかを判断します。1234 と "1234" は PHP によって数値とみなされます。数値型ではない場合、この変換ルールに従って、文字列は 0 に変換されます

したがって、上記の例では、添字の内容を含むデータにアクセスすると、 will インデックス 0 (< 文字) のデータを返します。

したがって、厳密に言えば、配列添字にアクセスするときは、その型が確実であることを保証するために、まずその型が配列型であるかどうかを判断する必要があります。

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