2012-02-26 7 views
0

ここで私は危険な知識があります。PHPオブジェクトの作成エンドレスループ

私は相互に関連するさまざまな種類のWebアプリケーションを開発中です。たとえば、 "Item"クラスと "User"クラスがあります。 "Item"クラスには、 "User"オブジェクトを参照する "Owner"というプロパティがあります。同様に、 "User"クラスには、 "Item"オブジェクトを保持している(それを推測した)配列である "Items_array"というプロパティがあります。

オブジェクトは自動的に参照として返されるため、fetch_item、fetch_userなどの関数があります。これらはオブジェクトのマスター配列を追跡し、既に存在する場合は正しい配列を返し、新しいものを作成しますそれが存在しなければ。以下は、例えば、ユーザーを取得するためのコードです。

public function get_user ($userID) { 
    if (!isset ($this->users_arr[$userID])) 
     $this->users_arr[$userID] = new User($userID); 
    return $this->users_arr[$userID]; 
} 

私のItemsクラスには、問題なくユーザーオブジェクトを格納するプロパティがあります。今朝私はItemオブジェクトを格納するUserクラスにいくつかのプロパティを追加しましたが、今は 'Unable to open database connection'エラーが発生しています。私はこれをItemオブジェクトの作成に分離しました。すべてがうまく動作するとコメントしています。私は、参照を使用するのではなく、アイテムがユーザーを作成していて、アイテムを再作成しようとする無限ループを作成していると確信しています。

これは意味がありますか?誰かがこれまでにこのようなことに就いたり、問題を解決する方法について考えていますか?

+3

'get_user()'を呼び出すようなコードを投稿してください –

+0

'__construct()'メソッドを利用していますか?そうでない場合、新しいオブジェクトを作成することは、定義内のスカラーによってのみプロパティを設定することができるため、ループ内でループすることはありません。 –

+0

あなたが記述したことは、おそらくデータベース接続エラーではなく、「メモリ不足」というエラーにつながります。データベースサーバーが実行されていますか? –

答えて

0

いくつかのコードが追加されたため、「データベース接続を開くことができません」というエラーが表示されるのは、あなたがあまりにも多くのコードを開くということだけです。たとえば、MySQLには1ユーザーあたり30の接続制限があります(それはあなたです)。通常、スクリプトごとに複数の接続を設定しないでください。接続ハンドルをグローバルに保存しないと、エラーが発生している可能性があります。

+0

私のdb接続ファクトリは上記と同じロジックを使用していましたが、タイプによっては既存の接続が返されていないことが判明しました!これを「エンドレスループ」問題(これも解決済み)と組み合わせると、db接続エラーが発生していました。私がループの問題を導入する前に、私は決してコネクションの数を最大にしませんでした。 –

関連する問題