2010-05-08 3 views
1

у меня есть этот код:Как сделать объекты доступными по всему миру?

class IC_Core { 

    /** 
    * Database 
    * @var IC_Database 
    */ 
    public static $db = NULL; 

    /** 
    * Core 
    * @var IC_Core 
    */ 
    protected static $_instance = NULL; 

    private function __construct() { 

    } 

    public static function getInstance() { 
     if (! is_object(self::$_instance)) { 
      self::$_instance = new self(); 
      self::initialize(self::$_instance); 
     } 
     return self::$_instance; 
    } 

    private static function initialize(IC_Core $IC_Core) { 
     self::$db = new IC_Database($IC_Core); 
    } 

} 

, но когда я хочу IC_Database доступа с:

$IC = IC_Core::getInstance(); 
$IC->db->add() // it says that its not an object. 

я думаю, что проблема заключается в самостоятельной :: $ дб = новый IC_Database ($ IC_Core);

но я не знаю, как заставить его работать.

кто-то может дать мне руку =)

спасибо!

ответ

2

Мне кажется, что initialize должен быть методом экземпляра, а не статическим. Затем БД следует установить с помощью $this->db, а не self::$db.

public static function getInstance() { 
     if (! is_object(self::$_instance)) { 
      self::$_instance = new self(); 
      self::$_instance->initialize(); 
     } 
     return self::$_instance; 
    } 

    private function initialize() { 
     $this->db = new IC_Database($this); 
    } 

Можно даже поместить содержимое метода initialize в конструктор-таким образом, вам не придется беспокоиться о вызове его.

+0

спасибо, что это сработало! –

+0

Похоже, что у вас есть статический '$ _instance' с нестатической' $ db'. – Tgr

+0

@Tgr: '$ db' является локальным для экземпляра, но есть только один из них. Он работает эффективно одинаково. –

1

свойство $ db объявлено static, поэтому вы должны получить к нему доступ с двойной двоеточием. нотация стрелок предназначена только для нестатических свойств.

$IC = IC_Core::getInstance(); 
IC_Core::$db->add(); 
Смежные вопросы