2011-07-16 14 views
1

[OK]をので、私持って正常に動作するよう、次のコードの設定:php classes - 既存のオブジェクト内に "module"オブジェクトをロードするにはどうすればいいですか?

ユーザーハンドラ「モジュールを」:

class user_handler 
{ 
    private $dbo; 

    public function __construct($dbo) 
    { 
     $this->dbo = $dbo; 
    } 

    public function user_table_method() 
    { 
     $this->dbo->generic_db_method(); 
    } 
} 

接続クラス:

class connection 
{ 
    private $dbc; 

    public $user; 

    public function __construct() 
    { 
     $this->dbc = 'connection'; 
     $this->user = new user_handler($this); 
    } 

    public function generic_db_method() 
    { 
     echo '<p>doing stuff with ' . $this->dbc . '</p>'; 
    } 
} 

がそれから私がアクセスできるユーザー・ハンドラそのような方法:

$dbc = new connection(); 
$dbc->user->user_table_method(); 

私の質問はこれです

connectionクラスのメソッドでは、_userオブジェクトは必要なときにのみ作成できますか?

私は何の考えていることはそうのように使用される方法です:

:ゼロから userと呼ばれる新しいパブリックプロパティを作成し、新しい user_handlerオブジェクトとして設定します

$dbc->add_handle('user', 'user_handler'); 

$dbc = new connection(); 
$dbc->add_handle('user', 'user_handler'); 
$dbc->user->user_table_method(); 
:それを設定するための新しい方法は次のようになります..so
// in more detail 
public function add_handle($name, $module) 
{ 
    if(!isset($this->/*somehow use $name*/)) 
    { 
     $this->/*somehow use $name*/ = new /*somehow use $module*/(); 
    } 
} 

ありがとうございます!私が述べたように

$dbc = new connection(); 
$name = 'user'; 
$module = 'somemodule'; 
$dbc->add_handle($name, $module); 
$dbc->user->user_table_method(); 

は私も$ユーザに$の_userからそれを名前を変更しました:そして、あなたはどのように考えていたのに似てやるだけです

+1

パブリック変数またはメソッドをアンダースコアで開始しないでください。それは混乱しています。 – Mike

+0

まあ、私はPHPの初心者ですので、混乱の笑いを許してください、何がそんなに混乱させるように私に教えてください。 :) –

+1

アンダースコアで始まる名前を付けるメソッドまたはプロパティは、一般にプライベートメソッドまたはプロパティであり、publicではありません。明快さのためにhttp://pear.php.net/manual/en/standards.naming.php – Mike

答えて

1
public function add_handle($name, $module) 
{ 
    if(!isset($this->$name)) 
    { 
     $this->$name = new $module(); 
    } 
} 

(アップPHP 5.2を見て)それは公開されているのでコメント。

+0

これは1つのアイテムに対して機能します..与えられた値を取り、それを処理する必要があります - そうでなければ、いくつかの 'add_handle()'メソッドを書くつもりです、可能なすべてのハンドラ "module"に対して1つ。 –

+0

あなたは何回ですか持ってる? add_handle()メソッドでスイッチを使用するか、型ごとに1つずつ、複数のadd_handle_ *メソッドを作成することができます。 – Mike

+0

ほとんどの場合、特に2つの異なるデータベースと対話する必要がある場合を除き、スクリプト内に1つのデータベースハンドルしか必要ありません。 – Mike

関連する問題