2010-10-05 115 views
0

我想使用單例方法來訪問一個全局對象(在這個例子中它的「用戶名」)。我的問題是如何修改這個,以便在DB->connect()函數中我可以做echo $this->username;而不是聲明$ username或更改最後2行?使用單例方法來創建一個全局對象

class CI_Base { 

    private static $instance; 

    public function CI_Base() 
    { 
     self::$instance =& $this; 
    } 

    public static function &get_instance() 
    { 
     return self::$instance; 
    } 
} 

function &get_instance() { 
    return CI_Base::get_instance(); 
} 

class Foo { 
    function run() { 
     $CI = & get_instance(); 
     $CI->username = "test"; 
     $db = new DB; 
     $db->connect(); 
    } 
} 

class DB extends Foo { 
    function connect() { 
     $CI = & get_instance(); 
     echo $CI->username; 
    } 
} 

$foo = new Foo; 
$foo->run(); 
+3

Singleton是[pattern](http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29),而不是一種方法。 [你應該避免它](http://stackoverflow.com/questions/1996230/how-bad-are-singletons)。 – Gordon 2010-10-05 14:17:11

回答

1

這應該工作

class Foo { 
    function __get($field) { 
    if ($field == "username") { 
     //don't need to create get_instance function 
     $CI = CI_Base::get_instance(); 
     return $CI->username; 
    } 
    } 
} 

你可以通過所有訪問來自富不存在的領域,達到實例對象:

class Foo { 
    function __get($field) { 
     $CI = CI_Base::get_instance(); 
     return $CI->$field; 
    } 
} 

 

class DB extends Foo { 
    function connect() { 
     // this->username will call __get magic function from base class 
     echo this->username; 
    } 
} 

在PHP5你不需要在get_instance之前加上&符號,因爲所有對象都通過引用傳遞。

+1

沒有冒犯,OP要求這樣做,但我爲那個必須維護,測試和調試這個噩夢的可憐傢伙感到可惜。 – Gordon 2010-10-05 15:46:46