[PHP-users 28580] Re: スカラー変数と配列の扱いについて

HOTTA Michihide hotta @ net-newbie.com
2006年 2月 25日 (土) 15:39:10 JST


堀田@長崎市です。

On Fri, 24 Feb 2006 20:24:52 +0900 
Subject: [PHP-users 28578] スカラー変数と配列の扱いについて
yuki yamashina <uk_oasis @ hotmail.com> wrote:

> 今、オライリーの「初めてのPHP5」で勉強をしているのですが
> スカラー変数に値を代入した後、変数名が同じ配列に値を代入して
> 結果を表示させようとしたところWarningがでてしまいます。
> 逆にすると特にエラー無く正常に表示されます。
> これは、PHPの仕様なのでしょうか?

手元の環境でも似たような結果になりました。

hotta @ home:~$ cat a.php
<?php
function    check($varname) {
    global  $$varname;
    $var = $$varname;
    print_r($var);  print "\n";
    if (is_array($var))    {
        printf("\$%s は配列です。\n", $varname);
    } else if (is_string($var))    {
        printf("\$%s は文字列です。\n", $varname);
    } else if (is_int($var))    {
        printf("\$%s は数値です。\n", $varname);
    } else  {
        printf("\$%s は上記以外です。\n", $varname);
    }
}
print `uname -rs`;
print PHP_VERSION . "\n";

print "-- setting \$a = abcdef\n";
$a = 'abcdef';
check('a');

print "-- setting \$a['i'] = 123\n";
$a['i'] = 123;
check('a');

print "-- setting \$a['2'] =456\n";
$a['2'] = 456;
check('a');

print "-- setting \$a = 123456\n";
$a = 123456;
check('a');

print "-- setting \$a['j'] = 'xyz'\n";
$a['j'] = 'xyz';
check('a');

print "-- setting \$a = あいう\n";
$a = 'あいう';
check('a');
?>

hotta @ home:~$ php a.php
Linux 2.4.31-0vl1.8
5.1.2
-- setting $a = abcdef
abcdef
$a は文字列です。
-- setting $a['i'] = 123
1bcdef
$a は文字列です。
-- setting $a['2'] =456
1b4def
$a は文字列です。
-- setting $a = 123456
123456
$a は数値です。
-- setting $a['j'] = 'xyz'
PHP Warning:  Cannot use a scalar value as an array 
 in /home/hotta/a.php on line 36
123456
$a は数値です。
-- setting $a = あいう
あいう
$a は文字列です。

なお、php-4.4.1 でも同じ結果でした。

スカラー変数と配列変数は、(perlでは別だったような記憶がかすかに
ありますが)少なくとも PHP では同じ名前空間に割り当てられます。

"abcdef" を代入した時点で $a は文字列として取り扱われてしまいま
す。で、文字列(=文字の一次元配列みたいなもの?)に対して 
『$変数名['キー'] 』のような参照を行うと、『$変数名['添字'] 』と
して取り扱われます。また変数の中身がいったん数値になってしまうと、
もはや『$変数名['添字'] 』というアクセスもできなくなります。

混乱を避けるためかどうか知りませんが、最近は『$変数名['添字'] 』
のようなアクセスの仕方はあまり見かけないような気がします。

とりあえず使う立場としては、こういう仕様だと割り切って、こんな使
い方をしないように努めないといけないですね;-)(自戒を込めて)

-- 
〒851-2195 長崎県西彼杵郡長与町まなび野1-1-1
県立長崎シーボルト大学 情報センター 堀田 倫英 <hotta @ sun.ac.jp>
TEL/FAX 095-813-5162  内線:4212



PHP-users メーリングリストの案内