PHP中用下標符號[]去讀取字串的邏輯

來源:互聯網
上載者:User

標籤:sep   ase   cas   ack   注意   ring   art   代碼   operator   

PHP中 [(下標)] 符號不僅能夠應用於數組和對象,還能夠應用於字串,假設不注意非常easy出錯。

比方擷取一個網路介面,正常情況下會返回一個數組結構的json,經過解析之後結果為:

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


我們擷取到介面資料之後,通過下面語句來推斷content是否有值的話,就會有問題:

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

由於可是假設server異常。可能會返回以下的HTML字串:

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

這樣的情況下。經過json_decode解析我們假設使用上面的語句,就會獲得一個 < 字元,這是為什麼呢?

我們來看一下 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。

所以,上面那個範例中。訪問下標為 content 的資料時。就會返回下標為0的資料,也就是 < 字元。

所以。嚴謹地來說,訪問一個數組下標的時候,要首先推斷一下這個類型是不是數群組類型,才幹保證萬無一失。

PHP中用下標符號[]去讀取字串的邏輯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.