2010-11-19 35 views
0

我在創建一個我正在處理的框架項目中創建「超級對象」(類似於CodeIgniter)時遇到了一些麻煩。超級對象的可變範圍問題

我想創建一個超級對象,我所有的其他類都會運行。我這樣做了,但似乎我無法在每個類中使用我的超級對象的對象,而無需在每個函數中使用全局關鍵字。

我有這樣的事情:

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中,那麼它就可以工作(或者至少在我真正的項目中,我不知道這個5秒鐘的模型是什麼)。

那麼有沒有辦法讓$ blah對象成爲全局對象,這樣我就不需要爲每個方法都引用它,或者有更好的方法來實現我想要做的事情嗎?

我不是在OOP很好...

+0

可能的重複:http://stackoverflow.com/questions/1234445/php-global-variables – thomaspaulb 2010-11-19 05:27:34

回答

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 2010-11-19 05:43:47

+0

@Scott如果一個類擴展* blah,當然它可以像使用它自己一樣使用blah的方法。 – deceze 2010-11-19 05:45:33

+0

我會盡力解釋這一點,裸露在我身邊。如果我通過「superobj」加載「class b」,就像我在上面的例子中所做的那樣,我不能使用「class a」的方法。如果我在superobj之外加載「class b」,那麼它工作。但是我需要它能夠通過superobj加載,所以我只需要爲我的所有庫使用一個對象。編輯:請注意,在我上面的例子中,我不擴展等等,但是在我真實的項目中,例如,調用$ this-> a-> aa不起作用。 – Scott 2010-11-19 05:51:53