2010-12-20 10 views
0

私はクラス "User_registration"を持っています。このクラスでは、 "Location"、 "Links"、 "Mail"、 "Module"は多くのクラスを実行しています。PHP OOP

私はすべてのクラスをファイルに含めます: は 'class/location.php'を含みます。 には 'class/links.php'が含まれています。 には 'class/mail.php'が含まれています。 には 'class/modules.php'が含まれています。

"User_registration"クラスを作成します。

方法で、私は必要
<?php 
class User_registration{ 

    public function insert_to_db($name, $country_code, $home_page) 
    { 
     //work with data 

     return id; 
    } 

    public function show_info($id) 
    { 
     //work with data 
    } 

} 

$reg_u = new User_registration; 
$res = $reg_u->insert_to_db($name, $country_code, $home_page); 

if($res){ 
    $reg_u->show_info($res); 
} 
?> 

実行クラス「insert_to_db」:「場所」、「リンク」、「メール」メソッド と「show_info」「場所」、「リンク」のいくつかの方法を実行し、「モジュール」でクラス。

どのようにですか?どのように一つのクラスに(1 no't)の助けを

感謝を別のクラスを実行します。)

+0

オブジェクトのインスタンスを作成してそのメソッドを呼び出すことも、適切なメソッドを静的にして静的に呼び出すこともできます。 –

答えて

2

これを行うには、いくつかの方法があります。別のクラスが利用する必要があるオブジェクトが2つしかない場合は、依存関係注入を使用します。各オブジェクトを引数としてクラスのコンストラクタに渡し、それらのオブジェクトをクラスプロパティとして格納します。

オブジェクトを必要とするメソッドが1つだけの場合は、メソッドの引数としてオブジェクトを渡します。私は長期的には拡張性/コードの清潔さを妨げると感じているので、私はこのアプローチを推奨しません。

複数のクラスに必要なオブジェクトがたくさんある場合は、クラスのコンストラクタに注入するレジストリをお勧めします。レジストリはシングルトンです(共有する必要がある各オブジェクトの単一インスタンスを保持します)。共有オブジェクトを使用する必要があるクラスでは、$this->registry->get('Some_Shared_Object')->doSomething()と呼びます。


class Foo { 
    protected $dependency1; 
    protected $dependency2; 
    protected $dependency3; 

    public function __construct($dependency1, $dependency2, $dependency3) { 
     $this->dependency1 = $dependency1; 
     $this->dependency2 = $dependency2; 
     $this->dependency3 = $dependency3; 
    } 

    public function foo() { 
     $this->dependency1->doSomething(); 
    } 
} 

$foo = new Foo($dependency1, $dependency2, $dependency3); 
$foo->foo();

依存性注入(方法において、推奨されていない)

class Foo { 
    public function foo($dependency1) { 
     $dependency1->doSomething(); 
    } 
} 

$foo = new Foo(); 
$foo->foo($dependency1);

依存性注入レジストリ

使用(コンストラクタで)

依存性注入

class Registry { 
    var $data = array(); 

    function __get($key) { 
     return $this->get($key); 
    } 

    function __set($key, $value) { 
     $this->set($key, $value); 
    } 

    /** 
    * Retrieve a resource from the registry. 
    * 
    * @param string 
    * @return mixed|null 
    */ 
    function get($key) { 
     return isset($this->data[$key]) ? $this->data[$key] : NULL; 
    } 

    /** 
    * Store a resource in the registry. 
    * 
    * @param string 
    * @param mixed 
    */ 
    function set($key, &$value) { 
     $this->data[$key] = $value; 
    } 

    /** 
    * Check if a resource exists in the registry. 
    * 
    * @param string 
    * @return boolean 
    */ 
    function has($key) { 
     return isset($this->data[$key]); 
    } 
} 

class Foo { 
    protected $registry; 

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

    public function foo() { 
     $this->registry->dependency1->doSomething(); 
    } 
} 

$dependency1 = new Dependency1(); 
$registry = new Registry(); 
$registry->set('dependency1', $dependency1); 

$foo = new Foo($registry); 
$foo->foo();
+0

ありがとうございますが、いくつかの例がありますか? – lolalola

+0

例で編集 – simshaun

1

良い練習として、クラスからクラスを呼び出すときは、常にinclude_once/require_onceを使用します。そういう意味で私は、クラスが参照するクラスがどこで使われているかに関係なく、ラップしていなくても知っています。

それぞれのインスタンスを初期化し、そこからメソッドを呼び出します。静的な参照を恐れないでください。

+0

クラス内のファイル(依存関係、たとえばクラス)を含めることについて話していますか?もしそうなら、それは柔軟性に欠けます。 – simshaun

関連する問題