Autor Zpráva
gcX
Profil *
Ahoj. Řeším docela zajímavý problém. Mám třídu MojePDO která rozšiřuje PDO. Tato třída mimo jiné přidává možnost "líných spojení", tzn. že se připojí k db až tehdy, jeli proveden nějaký dotaz, tzn. před nějakým dotazem třeba query se nejprve zkontroluje, zda je připojení aktivní, pokud ne, tak se zavolá "\call_user_func_array('parent::__construct', $this->lazyConnectionParams);". Pokud toto selže (spojení nelze navázat) tak se vyhodí výjimka do zbytku skriptu. Dále mám třídu Storage, které je kontejner pro různá úložiště. Funguje to takto:
Storage::setDriver('MojePDO')
    ->build(array(
        'dsn' => 'mysql:host=localhost;dbname=test',
        'username' => 'user',
        'password' => 'umyslnespatneheslo',
        'lazy' => true
    ))
    ->saveAs('pokus');


//problemovy kod
    
$pokus = Storage::load('pokus');

try {
  $pokus->query('SELECT * FROM `tabulka`');
}
catch(\Exception $e) {}

$pokus = Storage::load('pokus'); // toto už nefunguje (ani další přímý $pokus->query('SELECT * FROM `tabulka`');), protože pokus už neexistuje (objekt zanikl i když na něj ukazuje proměnná v třídě Storage a jako hodnota proměnné je nyní NULL)



// funkci kod

try {
Storage::load('pokus')->query('SELECT * FROM `tabulka`');
}
catch(\Exception $e) {}

try {
Storage::load('pokus')->query('SELECT * FROM `tabulka`');
}
catch(\Exception $e) {}

// tento kod funguje - tj. pokud primo nactu objekt z promenne ve tride Storage, jinak pokud ho nejprve načtu do další proměnné, tak se mezitím ten objekt nějak zlikviduje.

Toto chování mi přijde velice podivné, ještě se mi nestalo aby php likvidovalo objekty na které ukazuje nastavená proměnná. Mám php 5.3.2. Je toto chování BUG nebo je to zas další speciální feature phpčka?
gcX
Profil *
Abych to upřesnil - ten objekt se vymaže pouze pokud selže volání funkce v tom vytvořeném objektu - konkrétně konstruktoru rodiče ("\call_user_func_array('parent::__construct', $this->lazyConnectionParams);"). Nevíte co s tím? Je to moje chyba nebo chyba php?
gcX
Profil *
Oprava: funkcni kod je vlastně nefunkční, já si neuvědomil, že Storage vyhodí výjimku jako první. Nicméně to neřeší to jak může zaniknout objekt na který ukazuje proměnná?

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: