[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 メーリングリストの案内