使用单例方法创建全局对象

时间:2010-10-05 14:11:18

标签: php codeigniter singleton

我正在尝试使用单例方法来访问全局对象(在此示例中为“用户名”)。我的问题是如何修改此问题,以便在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();

1 个答案:

答案 0 :(得分: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;
    }
  }
}

您可以将对Foo中的非现有字段的所有访问权限传递给$ instance object:

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之前加上&符号因为所有对象都是通过引用传递的。