2016-05-12 6 views
1

Grüße gute Leute,Aufruf der statischen Funktion gibt NULL zurück, wenn das Objekt nicht instanziert ist? PHP OOP

Ich bin mit einigen Problemen mit OOP vor kurzem ausgeführt. Zunächst möchte ich CRUD Db Klasse von Grund auf neu erstellen. Dies ist ein Code:

class Database{ 

    public static $link; 
    public $message; 
     public function __construct() { 

     try { 
      self::$link = mysqli_connect(HOST, USER, PASS, DB); 

      if (!self::$link) { 
       echo self::$link->error; 
      } 


     } catch (Exception $e) { 
      die(" Failed connecting to DB") ; 
     } 
    } 

    public static function query($SQL){ 

     return self::$link->query($SQL); 

    } 
     public static function select($table, array $columns){ 
     $columns=implode(",",$columns); 
     $result=self::query("SELECT $columns FROM $table"); 


     return self::$link->fetch($result); 
    } 

} 

Also das Problem ist folgendes:

Wenn ich meine statische Funktion wählen wie folgt aufrufen:

Database::select('users', array('username'=>'user')); 

Es gibt: Fatal error: Rufen Sie an ein Mitglied Funktion Query() auf einem Nicht-Objekt in .. Und wenn ich Verbindung wie folgt debuggen: var_dump(Database::$link) gibt NULL Aber wenn ich "$ db = new Database();" über dieser Linie funktioniert es?

Kann mir jemand sagen, was ich falsch mache?

Danke!

+0

Ich habe nicht bemerkt, dass: (HOST, USER, PASS, DB) sind Konstanten, die aus einer anderen Datei enthalten sind. – fugitive

Antwort

1

Sie rufen eine statische Methode auf. Also, das Objekt wird NICHT instanziiert werden. Also, __construct() Methode wird nicht aufgerufen werden. Das bedeutet, $link Eigenschaft wird nicht ausgefüllt.

Was immer Sie tun, Sie müssen eine Verbindung zu Ihrer DB herstellen. Sie können entweder eine statische Methode connect() aufrufen, die Verbindung zur Datenbank wird und bevölkern $link oder in jedem Verfahren stellen Sie sicher, dass die Verbindung erfordern, dass die Verbindung hergestellt ist:

public static function connect() 
{ 
    try { 
     self::$link = mysqli_connect(HOST, USER, PASS, DB); 
     if (!self::$link) { 
      echo self::$link->error; 
     } 
    } catch (Exception $e) { 
     die(" Failed connecting to DB") ; 
    } 
} 

public function select(SQL) 
{ 
    if (!static::$link) { 
     static::connect(); 
    } 

    // your stuff 

} 

Es ist eine gute Sache, die Sie lernen möchten. Bevor Sie sich mit bestimmten Projekten beschäftigen, müssen Sie mit OOP vertraut sein: Konstruktoren/Destruktoren, Accessoren, Mutatoren, statische Methoden usw. Es ist wichtig, da es die Grundlage von allem ist, was Sie als nächstes tun wollen.

+0

Das ist nur ein Problem, von vielen –

+0

Können Sie die Probleme aufzeigen? @ YourCommonSense – fugitive

+0

@YourCommonSense Ich verstehe, dass MilosM lernen will. Das Hauptproblem ist hier nicht die Datenbanknutzung, sondern die OOP-Prinzipien. – Arcesilas

Verwandte Themen