標籤: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中用下標符號[]去讀取字串的邏輯