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

WADA Hiroyuki php-users@php.gr.jp
Sun, 03 Mar 2002 15:48:11 +0900


Naofumi Kondoh wrote:

> > > arr['foo'] is bar
> > > arr['foo']['bar'] is b
> >
> > ゴミでなくて、arr['foo']が文字列'bar'だから先頭の1文字を返してる
> > ように見えますが。文字列への配列アクセスがまだ生きてるんでは?
> 
> 細いことですが、 $arr['foo']['bar'] という要素は
> 定義されていないので、どのような文字であれ、文字
> を指すこと自体が間違いです。

「要素は定義されていない」というより$arr['foo']が文字列であれば
そもそも要素を持てないのではないでしょうか?PHPの文字列はJavaや
JavascriptのオブジェクトなStringとは違いますよね?

文字列に対して[]を適用すると文字列中のキャラクタ参照になって、
[]の中は数値コンテクストで評価されるので文字列=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
てな具合です。

(文字列中のキャラクタ参照は[]でなく{}を使うように推奨されてるので、
「まだ生きてる」という表現をしました。)

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

最初に戻って、

class testclass { var $dd = ""; }
$test = new testclass();
if (isset($test->dd[0])){

というのは、ddが配列であるつもりなのに""で初期化してるのが
おかしいのだと思います。
array()にするとwarningがでません。

和田@修行中