ホームページ >バックエンド開発 >PHPチュートリアル >PHP で下付き文字 [] を使用して文字列を読み取るロジック
PHP では、 [(subscript)] 記号は配列やオブジェクトだけでなく文字列にも適用される可能性があるため、注意しないと間違いを犯しやすくなります。
たとえば、ネットワーク インターフェイスを取得する場合、通常の状況では解析後の結果は次のようになります:
array('content' => 'This is returned by interface')
if (!empty($result['content'])) echo $result['content'];
<html> <head> <title>505</title> </head> <body> Service Internal Error </body></html>
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 (< 文字) のデータを返します。
したがって、厳密に言えば、配列添字にアクセスするときは、その型が確実であることを保証するために、まずその型が配列型であるかどうかを判断する必要があります。