[PHP-users 26147] Re: Referenceの仕様変更(was Re: PHP 4.4.0 Release Announcement)

Yasuo Ohgaki yohgaki @ ohgaki.net
2005年 7月 13日 (水) 17:06:44 JST


大垣です。

書きかけで送ってしまいましたが、前のメールでも何が悪いのか
分かったと思います。

Yasuo Ohgaki wrote:
> それほど難しく考える事はありません。スクリプト中に
> 
> "string"
> 
> array('a','b')
> 
> の様に定義した場合、「定数」としてコンパイルされます。
> 
> return 定数;
> 
> とした場合、定数としてコンパイルされた値を参照できてしまったため
> メモリ破壊が発生していました。このバグを修正したのが今回の修正で
> す。
> 
> 似たような例がバグレポートに載っています。こちらは定数の戻り値を
> 引数してしまった場合の例になります。とブログに書いたのでよろしけ
> れば参照してください。
> 
> http://blog.ohgaki.net/index.php/yohgaki/2005/07/13/ar_a_da_ca_ca_ra_c_s
> 

要するに定数へのリファレンスが作成され、そのリファレンスが
そのまま利用されてしまうような書き方は間違いである、という
ことです。

実践的ではないかも知れませんがcase文などで

switch($some_condition) {
 case FOO1:
 case FOO2:
   return "FOO";
   break;
 case BAR1:
 base BAR2:
   return "BAR";
}

の様な形で「定数」を関数・メソッドの戻り値として返し、その値を
「参照」としてアクセスするとエラーになります。

このような使い方は割と頻繁に見られるので今後は注意してコーディング
する必要があると思います。

-- 
Yasuo Ohgaki




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