Zadejte hledaný výraz...

Předávání objektů v PHP

Svata
verified
rating uzivatele
(3 hodnocení)
17. 6. 2008 22:32:39
Dobrý den,
mám třídu MyDB, která se mi stará o připojení k MySQL a o provádění nějakých operací s ní.
Když jsem vytvořil novou třídu s názvem Uzivatele, do každé funkce, kde jsem využíval databázi, jsem musel poslat objekt z MyDB, což považuju docela za logické (př. $db=new MyDB(); $a=new Uzivatel("jmeno",$db); ).
Mojí otázkou je, zdali se funkcím posílá celý objekt nebo jenom odkaz do paměti na tento objekt?
Pokud se posílá celý objekt, je to nejspíš dosti zbytečný nápor na operační paměť, tak mně zajímá, jak PHP nakládá s objekty, které již ve funkci dále nepoužívá?
Pokud máte nápad jak tento problém řešit efektivěji, rád si ho taky přečtu.
S pozdravem
Svaťa
17. 6. 2008 22:32:39
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84337
Predavat objekt db kazde tride neni nejlepsi napad. Resi se to tak ze db je singletonovska trida. Napr :
class Uzivatel {
public function neco(){
$db = DB::instance();
$db->query(...);
}
}
17. 6. 2008 22:39:53
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84336
timbulko
verified
rating uzivatele
(9 hodnocení)
17. 6. 2008 23:42:12
Ja by som ti riešil asi tak, že by som na začiatku scriptu naštartoval $db = new MyDB(); a potom by som v objekte Uzivatel nastavil premennu $db ako globalnu. To mi pripada ako najlepsie riesenie vzhladom na zataz na server.
17. 6. 2008 23:42:12
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84335
pres globalni promennou to neni zrovna moc ciste reseni, ale samozrejme pouzitelne je.
18. 6. 2008 00:07:48
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84334
David Grudl
verified
rating uzivatele
18. 6. 2008 06:29:56
Napsal svata;73005
Dobrý den,
Mojí otázkou je, zdali se funkcím posílá celý objekt nebo jenom odkaz do paměti na tento objekt?
Pokud se posílá celý objekt, je to nejspíš dosti zbytečný nápor na operační paměť, tak mně zajímá, jak PHP nakládá s objekty, které již ve funkci dále nepoužívá?
Svaťa
PHP posílá vždy referenci na objekt. Aby se objekt v paměti zduplikoval, bylo by nutné ho naklonovat $obj2 = clone $obj1;
18. 6. 2008 06:29:56
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84333
Svata
verified
rating uzivatele
(3 hodnocení)
18. 6. 2008 17:07:30
Napsal David Grudl;73047
PHP posílá vždy referenci na objekt. Aby se objekt v paměti zduplikoval, bylo by nutné ho naklonovat $obj2 = clone $obj1;
To jsem potřeboval vědět. Pokud se objekt přímo nekopíruje, snad je to fajn. Děkuji
18. 6. 2008 17:07:30
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84332
Napsal Hal;73031
pres globalni promennou to neni zrovna moc ciste reseni, ale samozrejme pouzitelne je.
můžeš to prosím objasnit?
určitě bych doporučil udělat z toho globální proměnnou než psát x řádků dalšího kódu (ten co jsi uvedl výše)
o tom, které z těchto dvou řešení by bylo efektivnější se můžeme dohadovat, logicky asi "global $db"...
nebo se pletu?
27. 9. 2008 12:13:24
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84331
Zdeněk Topič
verified
rating uzivatele
(2 hodnocení)
27. 9. 2008 12:36:56
No já bych to udělal třeba staticky abych mohl volat jednoduše MyDB::metoda();
27. 9. 2008 12:36:56
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84330
Hubert Frey
verified
rating uzivatele
(11 hodnocení)
27. 9. 2008 13:04:58
A co
class Uzivatel extends MyDB {
public function neco(){
$db = parent::instance();
$db->query(...);
}
}
27. 9. 2008 13:04:58
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84329
Zdeněk Topič
verified
rating uzivatele
(2 hodnocení)
28. 9. 2008 00:13:08
moc by se mi nechtelo u kazde dalsi tridy dedit databazovou tridu ...
28. 9. 2008 00:13:08
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84328
Hubert Frey
verified
rating uzivatele
(11 hodnocení)
28. 9. 2008 12:12:47
Zdeněk Topič
moc by se ti nechtělo nebo je to z programátorského hlediska špatné řešení?
28. 9. 2008 12:12:47
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84327
DaveLister
verified
rating uzivatele
(8 hodnocení)
28. 9. 2008 18:43:47
IMHO je dědění mnohem horší něž global...
Když by jsi v každé funkci používal $db= new MyDB() tak si myslím, že bude vždy vytvořen nový objekt a pokud by ses k DB připojival v konstruktoru tak by se ti to vždy znova připojovalo...
28. 9. 2008 18:43:47
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84326
Napsal Martin Zvarík;120490
můžeš to prosím objasnit?
určitě bych doporučil udělat z toho globální proměnnou než psát x řádků dalšího kódu (ten co jsi uvedl výše)
o tom, které z těchto dvou řešení by bylo efektivnější se můžeme dohadovat, logicky asi "global $db"...
nebo se pletu?
Neni tam ani radek navic oproti pouziti global promenne:)
misto napr global $db pisu treba $db = DB::instance();
Dalsi moznost je jak uz tu nekdo zminil primo definovat pro db class metody staticky DB::query(neco...);....
3. 10. 2008 00:11:29
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84325
btw. pouzivat globalni promenne v objektove navrzene aplikaci mi prijde trochu ujety....
Staci se podivat jak se to resi napr v CakePHP frameworku, je to tam delany prave pres singleton:
function save($data = null, $validate = true, $fieldList = array()) {
$db =& ConnectionManager::getDataSource($this->useDbConfig);
....
}
3. 10. 2008 00:20:05
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84324
Napsal Unregistered;122808
btw. pouzivat globalni promenne v objektove navrzene aplikaci mi prijde trochu ujety....
Staci se podivat jak se to resi napr v CakePHP frameworku, je to tam delany prave pres singleton:
function save($data = null, $validate = true, $fieldList = array()) {
$db =& ConnectionManager::getDataSource($this->useDbConfig);
....
}
Jasně, ale pokud se tady bavíme o připojení do databáze, které provádí 80% lidí ve skriptech jenom jednou, tak nevidím jediný důvod proč to dělat takto komplikovaně.
Prostě používejte global $DB.
Je to bez pochyb rychlejší a efektivnější.
A co se týče open-sourcu: často se vyplatí brát kód s rezervou (důvěřuj, ale prověřuj).
5. 10. 2008 01:39:02
https://webtrh.cz/diskuse/predavani-objektu-v-php#reply84323
Pro odpověď se přihlašte.
Přihlásit