[PHP-users 5824] Re: PHP 4.0 / 4.1 の isset() の相違

Yasuo Ohgaki php-users@php.gr.jp
Sun, 03 Mar 2002 17:55:42 +0900


WADA Hiroyuki wrote:
> 文字列に対して[]を適用すると文字列中のキャラクタ参照になって、
> []の中は数値コンテクストで評価されるので文字列=0で1文字目を
> 返す、というのは自然な感じですが。
> C:\php-4.1.0-Win32-mb>php
> <?
> $a="1234";
> $a['b']="3";
> echo $a;
> ?>
> X-Powered-By: PHP/4.1.0
> Content-type: text/html
> 
> 3234
> てな具合です。
> 
> (文字列中のキャラクタ参照は[]でなく{}を使うように推奨されてるので、
> 「まだ生きてる」という表現をしました。)

実は文字参照に{}を利用するのは奨められていません。
Andi(ZendEngineの作者)から、動作するが実装途中なので
使わないでほしい。PHPプログラマには知られたくない、と聞いて
います。(かなり前から{}は使えるようですが、、)

つまり{}を利用した文字参照の仕様は変る可能性があると言う事
です。個人的には正規表現、str*()関数でほとんど事足りるので。
文字列の文字参照は極力しない事にしています。また、関数を使った
方がPHPで文字を1つづつ処理するより速いはずです。

> 
> isset()の引数に渡された場合にどうなるべきかについては特に
> 意見はありません。値が参照可能だったのでtrueになってるんで
> しょうね。

この辺りはかなりいい加減なのできちんとなってほしいと思っています。
BNFが無いこともいい加減(?)な仕様になっている一因と思います。

> 
> 最初に戻って、
> 
> class testclass { var $dd = ""; }
> $test = new testclass();
> if (isset($test->dd[0])){
> 
> というのは、ddが配列であるつもりなのに""で初期化してるのが
> おかしいのだと思います。
> array()にするとwarningがでません。

この辺りの動作はかなり紛らわしく、早く仕様を決めて曖昧さが
なくなってほしいです。

文字参照について聞いたのは去年の事なので、時間がある
時ににでもZendEngine2リストに聞いてみます。

-- 
Yasuo Ohgaki
yohgaki@dd.iij4u.or.jp

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/