2010-11-19 13 views
0

私が取り組んでいるフレームワークプロジェクトの "スーパーオブジェクト"(CodeIgniterのものに似ています)を作成する際に問題があります。スーパーオブジェクトの可変スコープの問題

他のすべてのクラスが実行されるスーパーオブジェクトを作成したいと思います。私はそれをしましたが、すべての関数でglobalキーワードを使用せずに、各クラスでスーパーオブジェクトのオブジェクトを使用できないようです。

私はこのようなものがあります:

class a 
{ 
    function aa() 
    { 
     return 'class a'; 
    } 
} 

class b 
{ 
    function bb() 
    { 
     $blah->a->aa(); 
    } 
} 

class superobj 
{ 
    function loadClass($class) 
    { 
     $this->$class = new $class; 
    } 
} 

class blah extends superobj 
{ 
    function __construct() 
    { 
     $this->loadClass('a'); 
     $this->loadClass('b'); 
    } 
} 

$blah = new $blah; 

をだから私はこれを実行する場合、私はAAメソッドにアクセスすることはできませんので、私はエラーを取得します。メソッドbbにグローバル$ blahを置くと、それは動作します(または、少なくとも私の実際のプロジェクトでは、この5秒目のモックアップについては気にしません)。

$ blahオブジェクトをグローバルにして、すべてのメソッドで参照する必要がないようにする方法がありますか、それとも私がしようとしていることを達成するためのよりよい方法はありますか?私はOOPで非常によくないよ

...

+0

可能な複製:http://stackoverflow.com/questions/1234445/php-global-variables – thomaspaulb

答えて

3
function bb() { 
    $blah->a->aa(); 
} 

は確かに、任意の関数と同様に、この関数は、その範囲には、変数を持っていません。 $blahは、関数に渡されることも、関数にも定義されないため、存在しません。

オブジェクトがblahのインスタンスに依存する場合、そのオブジェクトをコンストラクタに渡す必要があります。

class b { 

    var $blah = null; 

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

    function bb() { 
     $this->blah->foo(); 
    } 
} 

$b = new b($instanceOfBlah); 

あるいは、グローバルオブジェクトへの参照を保持し、($blah = Registry::get('blah')ように、レジストリパターン)要求にそれらを返す静的クラスを使用します。

globalを使用しないでください。ただしないでください。

+0

私はこれをblahのコンストラクタに行うことができるので、blahを拡張するすべてのクラスは自動的にそのクラスを使用できます方法? – Scott

+0

@Scottクラス*が* blahを拡張している場合はもちろん、それは自分のメソッドと同じようにblahのメソッドを使うことができます。 – deceze

+0

私はこのことを説明しようとします。私が上記の例でやっているのと同じように、 "class b"を "superobj"を通してロードすると、 "class a"のメソッドを使うことはできません。私がsuperobjの外に "class b"をロードすると、それは動作します。しかし、私はsuperobjを通して読み込むことができるようにする必要があるので、すべてのライブラリに1つのオブジェクトを使用する必要があります。編集:私の上記の例では、私は本当のプロジェクトで私は、そして$ this-> a-> aaを呼び出すことは、うまくいきませんが、blahを拡張していないことに注意してください。 – Scott