[PHP-dev 982]無名のメンバ変数

UNO Shintaro uno @ venus.dti.ne.jp
2004年 1月 26日 (月) 17:42:19 JST


身近に、こんなコードを書いてハマッてる人がいました。
(PHP 4.3.4)

<?php
class X {
 var $a;
 var $b = 0;
 var $c = 'abcdefg';
 function X($i){
  $this->$a = $i;
 }
}
$x = new X(1);
print_r($x->$a);
print_r($x->$b);
print_r($x->$c);
?>

これを走らせると結果が111になります。
こうなる理由が分からない、PHPのバグなのではないか?
というのです。


ざっくり解説すると「$this->$a」「$x->$a」「$x->$b」「$x->$c」
という書き方が本人の意図とは違い、“可変メンバ変数”になって
います。「無名のメンバ変数」を読み書きしているのです。
試しにprint_r($x)してみると、
x Object ( [a] => [b] => 0 [c] => abcdefg [] => 1 )
となり、無名のメンバ変数ができていることが分かります。

一応、コードが間違ってるってことでその場はけりをつけました。


しかしそもそも無名のメンバ変数なんてものを許していいのか?
この書き間違いは、けっこう起こしやすいと思いますし、
意図して無名メンバ変数を使うような用途が思いつきません。
なので、気付きを促す意味で、無名メンバ変数へのアクセスには、
実行時にErrorかWarningかNoticeを出すべきではないか?
と感じました。
もちろん、この例では変数a、b、cが定義されていないとNoticeが
出てきますけれど、それではいまいち分かりにくいと思うのです。

皆さんどう思われますか?

-- 
UNO Shintaro, 宇野 信太郎
mailto:uno @ venus.dti.ne.jp
http://www.venus.dti.ne.jp/~uno/



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