Использование метода singleton для создания глобального объекта - PullRequest
0 голосов
/ 05 октября 2010

Я пытаюсь использовать метод синглтона для доступа к глобальному объекту (в данном примере это «имя пользователя»). У меня вопрос, как я могу изменить это так, чтобы в функции 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 Ответ

1 голос
/ 05 октября 2010

Это должно работать

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:

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;
    }
}

inphp5 вам не нужно ставить амперсанд перед get_instance, потому что все объекты передаются по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...