| Autor | Zpráva | ||
|---|---|---|---|
| _fantomas Profil |
#1 · Zasláno: 28. 12. 2015, 15:01:23
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 |
#2 · Zasláno: 28. 12. 2015, 17:51:29
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 |
#3 · Zasláno: 28. 12. 2015, 23:55:58
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?. |
||
|
Časová prodleva: 11 let
|
|||
0