синглтон не работает для статической функции - PullRequest
0 голосов
/ 05 апреля 2011

Другая часть системы, вызвавшая проблему, проблема была решена

public static function getParticpantsIdsWithTitles(array $proftitlecodes)
{
     //connect_mysqli is a singleton, but everytime this is called a new instance is created
    $sqlconn = connect_mysqli::get_instance();
}

//All of these method calls cause the constructor of connect_mysqli to run

Participant::getParticpantsIdsWithTitles(array(1,2,3));    
Participant::getParticpantsIdsWithTitles(array(1,2,3));    

Есть ли какое-то правило, которое я не знаю о синглтоне при использовании его из статической функции? новый mysqli_object создается каждый раз. (ТОЛЬКО ОТ статических функций). Он отлично работает от нестатических функций.

private static $instance = FALSE;
  var  $host ;
  var  $dbUser ;
  var  $dbPass ;
  var  $dbName ;
  var  $dbConn ;
  var  $dbconnectError ;
  var  $query;
  var  $result;
  var  $row;

    function __construct () 
    {
        $this->host   = 'host' ;
        $this->dbUser = 'user' ;
        $this->dbPass = 'password' ;
        $this->dbName = 'db' ;
        $this->dbConn = new mysqli($this->host , $this->dbUser , $this->dbPass, $this->dbName )  ;

        file_put_contents("/Library/WebServer/Documents/test.txt", "CONNECT\n", FILE_APPEND);
        if ( !$this->dbConn )
        {
            trigger_error ('could not connect to server' ) ;
            $this->dbconnectError = true ;
        }
    }

    public static function get_instance()
    {
        if(!self::$instance)
        {
            self::$instance = new connect_mysqli();
        }

        return self::$instance;
    }

Ответы [ 2 ]

0 голосов
/ 05 апреля 2011

Я не могу воспроизвести вашу проблему, но я кое-что заметил в вашем синглтоне:

function __construct () 

По умолчанию метод __construct() будет иметь видимость public. Обычно конструкторы синглетонов помечаются как private, чтобы предотвратить создание экземпляров вне предоставленного метода get_instance().

Вы уверены, что когда-либо используете get_instance() и , а никогда не делаете что-то вроде $mysqli = new connect_mysqli()? Вы также уверены, что не создаете соединения БД из контекста вне вашего синглтона?

0 голосов
/ 05 апреля 2011

Я не могу воспроизвести вашу проблему. Следующий код печатает

Создан новый connect_mysqli

ровно один раз.

class foo 
{
  public static function getParticpantsIdsWithTitles(array $proftitlecodes)
  {
    $sqlconn = connect_mysqli::get_instance();
  }
}

class connect_mysqli
{
  private static $instance = FALSE;

  public function __construct()
  {
    echo "A new connect_mysqli was created\n";
  }

  public static function get_instance()
  {
    if(!self::$instance)
    {
      self::$instance = new connect_mysqli();
    }
    return self::$instance;
  }
}

for ($i = 0; $i < 10; ++$i)
{
  foo::getParticpantsIdsWithTitles(array());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...