Php 单身汉不';不适用于静态函数

Php 单身汉不';不适用于静态函数,php,singleton,Php,Singleton,系统的另一部分导致问题,问题已解决 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 thes

系统的另一部分导致问题,问题已解决

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_对象。(仅来自静态函数)。它在非静态函数中工作良好

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

我无法重现你的问题。下面的代码打印

创建了一个新的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());
}
class-foo
{
公共静态函数getParticpantsIdsWithTitles(数组$ProftTitleCodes)
{
$sqlconn=connect_mysqli::get_instance();
}
}
类连接\u mysqli
{
私有静态$instance=FALSE;
公共函数构造()
{
echo“创建了一个新的connect\u mysqli\n”;
}
公共静态函数get_instance()
{
如果(!self::$instance)
{
self::$instance=newconnect_mysqli();
}
返回self::$instance;
}
}
对于($i=0;$i<10;++$i)
{
foo::getParticpantsIdsWithTitles(数组());
}

我无法重现您的问题,但我确实注意到您的单身问题:

function __construct () 
这将默认
\u construct()
方法为
public
可见性。通常,单例的构造函数将标记为
private
,以防止在提供的
get\u instance()
方法之外实例化


您确定只使用了
get\u instance()
,而从未执行过类似
$mysqli=new connect\u mysqli()
的操作吗?您还确定您没有从singleton之外的上下文创建db连接吗?

请提供一个自包含的最小示例。getParticpantsIdsWithTitles有自己的示例class@ChrisMuench说明了。还是没问题。