[PHP-users 7261] Re: PHP のバグ?

Moriyoshi Koizumi php-users@php.gr.jp
Wed, 01 May 2002 11:18:04 +0900


小泉@町田です。

特に「writeDB内の記述順序を変えると正常に動作する」ってところから察するに、
クラスの参照とコピーをきちんと区別しないと痛い目にあいます。
(以前まったく同じような経験をしたので…)

PHP のクラスは弱いわけじゃないんですが、
これがまぎらわしいため、しばしば槍玉に上がります。
今回の妙な挙動もそのためじゃないでしょうか。

http://www.php.net/manual/ja/language.references.php


"Nobuyuki.Fukuoka" <fukuoka@tyo.mind.co.jp> wrote:

> はじめまして、
> このたび入会させていただいた福岡です。
> 
> 環境:
> Solaris/Apache(1.3.20)+OpenSSL(0.9.6)+mod_ssl(2.8.4)+PHP(4.2.0)+PostgreSQL(7.1.3
> )
> 
> PHPはまだまだ初心者です。
> 一部にオブジェクト指向を取り入れたCGIを製作中ですが、
> どうにも行き詰まってしまったので質問させてください。
> 
> 以下のようなクラスがあったとします。
> class    A
> {
>     var    $sub1,$sub2;
> 
>     function    A
>     {
>         $sub1 = new B;
>         $sub2 = new C;
>     }
>     function    writeDB( $db )
>     {
>         $sub1->writeDB( $db );
>         $sub2->writeDB( $db );
>     }
> }
> 
> class    B
> {
>     function    writeDB($db)
>     {
>         updateDB( $db );    // PostgreSQLテーブルの更新
>     }
> }
> 
> class    C
> {
>     function    writeDB( $db )
>     {
>         updateDB( $db );    // PostgreSQLテーブルの更新
>     }
> }
> 
> $obj =& new A;
> とした場合に
> $obj->writeDB($db);
> を実行します。
> この時にB,CそれぞれのメソッドwriteDBが実行されますが、
> 無事updateDB()内のpg_exec()はエラーもなく実行されるのに
> テーブルの更新が行なわれない「場合」があります。
> 問題のSQL文はpsql上では正常に実行されるのでPostgreSQL側の問題ではないと思いま
> す。
> 
> A::writeDB内の記述順序を変えると正常に動作しますが、
> この現象ってC言語などでバッファオーバーフローを起こしたときと似てますよね?
> 要は動けばいいんですが、現状では気味悪くて完成とは言えません。
> もちろん、どちらの場合もPHP、Apache、どちらもエラーは出ません。
> 
> 前述ソースはかなり割愛してますが、
> このようなクラスの中に別のクラスのインスタンスを含める形で
> もう少し大きなツリー上になります。
> その他は、
> ・処理によっては再帰呼び出し的な個所もあります。
> ・オブジェクトのやり取りは殆ど参照で行なってます。
> 
> どこかのサイトで「PHPのオブジェクトは弱い」と見たことがありますが、
> 「弱い」というのが他言語に比べて機能的に劣っている「弱い」なのか、
> 動作が安定しないという意味の「弱い」なのか?
> 
> 以上をふまえて
> 1.PHPに未知のセキュリティホールが存在する
> 2.現状ではコードを書き換えて対処するしかないが、その場所の特定方法
> 3.オブジェクトを実装する際のやってはいけない事
> 4.参照を使う際の注意事項
> 等について情報を求みます。お願いします。
> 
> 2.に関してはデバッガをインストールできれば良いのですが、
> Apacheモジュールを開発中でその影響か上手く動きません。
> 3.4.に関してはマニュアル記載の注意事項は遵守しているつもりです。
> 
> よろしくお願いいたします。
> *--------------------------------------------*
>   Nobuyuki.KAPPA.Fukuoka
>   HomePage : http://kappa.kusukusu.com/
>   E-mail(Private) : kappa@air.linkclub.or.jp
>   E-mail(Business) : fukuoka@tyo.mind.co.jp
> *--------------------------------------------*
> 
> _______________________________________________
> PHP-users mailing list
> PHP-users@php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users