2010-02-11 69 views
2

有沒有辦法在PHP中的函數內部訪問一個類的實例?就像這樣:全局PHP類的函數?

include("class.php"); 
$bla=new Classname(); 

function aaa(){ 
    $bla->DoSomething(); //Doesn't work. 
} 

$bla->DoSomething(); //Works. 

回答

4

如果我正確解釋你的問題,那麼正確的方法是創建一個單例類。

class Singleton { 
    private static $instance; 

    private function __construct() {} 
    private function __clone() {} 

    public static function getInstance() { 
     if (!Singleton::$instance instanceof self) { 
      Singleton::$instance = new self(); 
     } 
     return Singleton::$instance; 
    } 

    public function DoSomething() { 
     ... 
    } 
} 

你會在你的功能如下稱之爲:

function xxx() { 
    Singleton::getInstance()->DoSomething(); 
} 
+0

但如果他想要該類的多個實例呢?這裏不需要單身。 – GSto 2010-02-11 20:35:43

+0

再次閱讀他的問題。他特別詢問「有沒有辦法在php中的函數內部訪問一個類的實例」 – wimvds 2010-02-11 20:38:43

+1

而且就像我已經在答案中所說的那樣,只是一個小的鏈接,你應該遵循並自己決定,如果單例實際上是正確的: http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial – tDo 2010-02-11 20:46:45

6

使用global

function aaa() { 
    global $bla; 
    $bla->DoSomething(); 
} 

適用於所有的變量,而不僅僅是類。

+1

這是最直接的解決方案,將至少讓你稍微耦合的代碼工作,直到更優雅的代碼編寫。 – grantwparks 2011-08-07 19:45:21

1

如果您希望在整個應用程序中只使用一個類的單個實例,則應該使用單例而不是全局。你可以這樣做:

class Classname { 
    private static $instance; 

    private function __construct() {...} 

    public function doSomething() {...} 

    // The singleton method 
    public static function singleton() { 
     if (!isset(self::$instance)) { 
      self::$instance = new self; 
     } 

     return self::$instance; 
    } 

    private function __clone() { /* do nothing here*/ } 
} 


function aaa() { 
    Classname::getInstance()->doSomething(); 
} 
+0

鏈接中斷 – NaveenDA 2017-10-27 15:18:50

2

更簡潔的方法是通過引用給定的類傳遞實例,然後訪問它。

另一種方法是使用單例模式,儘管許多人認爲它並不比全局模式更好。

1

正如已經回答的那樣,您可以使用global variable來存儲類實例,但在我看來,您應該考慮使用諸如Singleton pattern之類的東西來代替更清晰的實現。

你可以找到一個簡單的單例類here的例子。