Autor Zpráva
_fantomas
Profil
Ahoj, mám problém, mám triedu databazy kde funkcia na pripojenie sa volá
public static function connect();

Pri volani tej triedy dam len

Database::conect();

a tu je problém že potrebujem spustíť najprv __construct potom ten connect a potom __destruct
Ale to akosi neviem ak používam statické funkcie môžte mi poradiť?
Antik4
Profil
Může to vypadat následovně:

class Database {

  public function __construct() {}
  
  public static function connect() {
    $c = new self; // Konstruktor
    
    $c->__destruct(); // Destruktor, zavolá se 2x
  }
  
  public function __destruct {}
}

Lepší by bylo napsat k čemu to potřebuješ, aby ses tomu mohl vyhnout.
Alphard
Profil
Snažím se ten dotaz pochopit nějak komplexněji, ale je napsán dost zmateně. Klasické řešení držení připojení k databázi ve statickém registru je návrhový vzor singleton. Řekněme
class Database {
  private static $connection;
  
  public static function getConnection() {
    if (self::$connection === null) {
      self::$connection = self::connect();
    }
    return self::$connection;
  }
  
  public static function destruct() { // běžná veřejná statická třída, není to automaticky volaný destruktor
    // ...
  }
}

a pak by se volalo Database::getConnection()->query('...');
V tomto případě se nikdy destruktor nezavolá, protože nebyla vytvořena instance. Maximálně můžete někam do shutdown části aplikace dát Database::destruct() a explicitně ho zavolat.

Destruktor se zavolá pouze při uklízení instance, to znamená, že je třeba nejdříve vytvořit instanci.

class DbConnection {
  private $connection;
  
  public function __construct() {
    $this->connection = /*...*/;
  }
  
  public function __destruct() { // tenhle destruktor se zavolá
    // úklid
  }
}

class Database {
  private static $connection;
  
  public static function getConnection() {
    if (self::$connection === null) {
      self::$connection = new DbConnection();
    }
    return self::$connection;
  }
}

V tomto případě by se měl zavolat destruktor instance třídy DbConenction.

Před spoléháním se na destruktor bych ale varoval, viz Diskuse JPW: Lze se spolehnout na destruktor?.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: