Nacky - Snowland.net

Nacky(Issei Ishii)がDJ/Composerのようなふりして書き散らすblogサイト

Info

2010-03-16

PHPの変数に添字アクセスしたときの挙動

PHPで文字列変数に添字をつけると文字がとれる!
(なんかやだなーこの仕様)

ということで挙動を見てみました.PHP5.1.6上.

$a='12345';
$b=12345;
$c=array('x','y','z');
として,それぞれvar_dump.
a : string(5) "12345"
a[0] : string(1) "1"
a[1] : string(1) "2"
a[2] : string(1) "3"
a[3] : string(1) "4"
a[4] : string(1) "5"
a[5] : string(0) ""
a[6] : string(0) ""
a[7] : string(0) ""

b : int(12345)
b[0] : NULL
b[1] : NULL
b[2] : NULL

c : array(3) {
[0]=>
string(1) "x"
[1]=>
string(1) "y"
[2]=>
string(1) "z"
}
c[0] : string(1) "x"
c[1] : string(1) "y"
c[2] : string(1) "z"
c[3] : NULL
c[4] : NULL
c[5] : NULL

a[5]とか文字列の範囲外にアクセスしたときに何でNULLじゃなくて空文字列なんだろう….

ちなみにdisplay_errorsをonにして見ると
a[5]~a[7]は「Uninitialized string offset」のnoticeが,
c[3]~c[5]は「Undefined offset」のnoticeが出ます.
なぜb[0]~b[2]には出ない…

ついでに
$a[10]='h'
とすると
a : string(11) "12345     h"
こちらは仕様通り,間にスペースが入れられます.
(「文字列への文字単位のアクセスと修正」参照)

じゃあマルチバイトだとどうなのよ!
$a="あいうeお"
として(文字コードUTF-8,mb_internal_encodingも指定)
a : string(13) "あいうeお"
a[0] : string(1) ""
a[1] : string(1) ""
a[2] : string(1) ""
a[3] : string(1) ""
a[4] : string(1) ""
a[5] : string(1) ""
a[6] : string(1) ""
a[7] : string(1) ""
a[8] : string(1) ""
a[9] : string(1) "e"
a[10] : string(1) ""
a[11] : string(1) ""
a[12] : string(1) ""
a[13] : string(0) ""
Notice: Uninitialized string offset: 13


とりあえずはこういうもんだと思っておくしかないな.
そもそもこんな形でアクセスしないで済むように書けばいいんですけどね.


posted at 17:52:53 on 2010-03-16 by nacky - Category: Com/Tech

TrackBack

このエントリにトラックバックはありません
トラックバックURL

Comments

No comments yet

Add Comments