2012-04-11 3 views
1

Ich versuche, eine db-util-Klasse mit dem Singleton-Muster zu schreiben. Mein Problem ist, dass das "Verbindung" -Objekt immer Null ist. Die Verbindungseinstellungen sind korrekt. Was könnte ich falsch machen? Außerdem bin ich relativ neu in PHP Entwicklung. Welche Methode sollte ich verwenden, um herauszufinden, was falsch ist? Code folgt.Mysqli-Konstruktor gibt null zurück

class DBUtil { 
     public $connection = NULL; //mysqli_connection object 
     private static $instance = NULL; 

     private function _constructor($conn){ 
      //$this->connection = mysqli_connect(TagMetroConfiguration::getConfigurationValueFor("db_servser_name"), TagMetroConfiguration::getConfigurationValueFor("db_username"), TagMetroConfiguration::getConfigurationValueFor("db_password"), TagMetroConfiguration::getConfigurationValueFor("db_name")); 
      $this->connection = new mysqli("localhost", "root", "toor", "testdb"); 
     } 

     public static function getInstance(){ 
      if(DBUtil::$instance == NULL){ 
       try{ 
        DBUtil::$instance = new DBUtil(); 
       }catch(Exception $ex){ 
        throw new Exception("Unable to create DB Instance"); 
       } 
      } 

      return DBUtil::$instance; 
     } 
} 
+0

Nun, das Singleton-Muster sieht zu kompliziert für Sie aus, aber das ist überhaupt kein Problem: Verwenden Sie keine Singletons. Sie brauchen sie nicht in PHP. In Ihrem Fall benötigen Sie nur eine globale Variable für die Datenbankverbindung. - Aber wenn Sie Lust auf Kopieren und Einfügen haben, [das PHP-Handbuch enthält ein Codebeispiel für das Singleton-Muster] (http://php.net/manual/en/language.oop5.patterns.php#language.oop5.patterns. Singleton) (nicht dass das alles besser macht, benutze es nicht). [Wer braucht Singletons?] (Http://stackoverflow.com/q/4595964/367456). – hakre

Antwort

3

Ihre Konstruktorfunktion sollte den Namen __construct haben (beachten Sie zwei Unterstriche).

Außerdem haben Sie in Ihrem Konstruktor einen Parameter $conn. Wenn Sie new DBUtil() aufrufen, stellen Sie diesen Eingabeparameter nicht bereit, also ruft es möglicherweise den Standardkonstruktor auf, nicht Ihren benutzerdefinierten.

Wenn der Eingangsparameter $conn optional sein soll, versuchen Sie __construct($conn = null).

Oder versuchen Sie es als new DBUtil(null) nennen.

2
private function _constructor($conn) ?? 

sollte dies

private function __construct($conn) 
+0

Möglicherweise möchten Sie auch den Standardwert auf null setzen, da Sie beim Instanziieren des Objekts keine $ conn-Variable übergeben. private Funktion __construct ($ conn = null) –

-1

Sie mögen dies tun sollten:

class DBUtil { 

     private static $instance; 

     private function _construct(){ 
      $this->$instance = new mysqli("localhost", "root", "toor", "testdb"); 
     } 

     public static function getInstance(){ 
      if(!isset(self::$instance){ 
       try{ 
        self::$instance = new DBUtil(); 
       }catch(Exception $ex){ 
        throw new Exception("Unable to create DB Instance"); 
       } 
      } 

      return self::$instance; 
     } 
2

Es zwei Unterstrichen sein sollte __ (__construct).