Zadejte hledaný výraz...

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

westrem
verified
rating uzivatele
5. 10. 2008 19:11:45
kazdopadne som za singleton.
Definovanie global premennej je dost "pracne". Zober si, ze mas X funkcii a kazda potrebuje referenciu na DB. Pri pouzivani global $DB mas tym padom o X riadkov kodu naviac - zbytocne. Singleton je trieda ako stvorena prave pre objekty, ktore su svojim sposobom jedinecne. Medzi take radim napr handler databazy a z osobnich skusenosti je dobre mat aj nejaku triedu settings a v nej v poli uchovavat nastavenia - je to ovela jednoduchsie a praktickejsie.
5. 10. 2008 19:11:45
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84322
Napsal westrem;123812
kazdopadne som za singleton.
Definovanie global premennej je dost "pracne". Zober si, ze mas X funkcii a kazda potrebuje referenciu na DB. Pri pouzivani global $DB mas tym padom o X riadkov kodu naviac - zbytocne. Singleton je trieda ako stvorena prave pre objekty, ktore su svojim sposobom jedinecne. Medzi take radim napr handler databazy a z osobnich skusenosti je dobre mat aj nejaku triedu settings a v nej v poli uchovavat nastavenia - je to ovela jednoduchsie a praktickejsie.
To je pravda, v takovém případě bych konal stejně :)
9. 10. 2008 17:39:38
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84321
pl4nt
verified
rating uzivatele
18. 10. 2008 03:01:03
Napsal Martin Zvarík;123546
Prostě používejte global $DB.
proboha v roce 2008 používat globální proměnné, ty jsi zamrzl někde u php 3-4 ;)
A taky všichni používejte $HTTP_POST_VARS místo $_POST a nezapomeňte si zapnout register_globals.
Napsal Martin Zvarík;123546
Je to bez pochyb rychlejší a efektivnější.
Je to bez pochyb nejhorší možné řešení daného problému.
18. 10. 2008 03:01:03
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84320
pl4nt
verified
rating uzivatele
18. 10. 2008 03:07:42
Napsal Hubert Frey;120812
Zdeněk Topič
moc by se ti nechtělo nebo je to z programátorského hlediska špatné řešení?
Nechtělo by se mi, ale hlavně je to z návrhové hlediska absolutně nemyslitelné (uživatel JE databáze?)
18. 10. 2008 03:07:42
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84319
Fuck You
verified
rating uzivatele
(1 hodnocení)
18. 10. 2008 07:01:38
Napsal pl4nt;129795
proboha v roce 2008 používat globální proměnné, ty jsi zamrzl někde u php 3-4 ;)
Nechám stranou, že otevíráš staré téma... Pokud je nějaký objekt, který se vytváří při každém požadavku a zároveň má být přístupný globálně, proč nepoužít globální proměnnou? Jaký je rozdíl mezi použitím globální proměnné a globální statické metody?
Předpokládám, že ty bys použil Registry nebo Singleton. Registry je vpodstatě způsob, jak napodobit globální proměnné v jazycích, kde nejsou. Singleton k tomu navíc přidává lazy loading, který v případě databázového spojení nebude nejspíš potřeba.
18. 10. 2008 07:01:38
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84318
pl4nt
verified
rating uzivatele
18. 10. 2008 23:15:16
Napsal llook;129803
Pokud je nějaký objekt, který se vytváří při každém požadavku a zároveň má být přístupný globálně, proč nepoužít globální proměnnou?
Protože něco globálního je prostě zlo, které znepřehledňuje kód. Raději v každé metodě napíšu (resp. použiji Singleton jak píšeš):
# Samozřejmě je bráno v potaz, že se jedná o oop aplikaci s autoloaderem apod.
$db = Database::Connect();
$db->query("SELECT ...");
a budu mít jistotu, že si někde o 1000 řádku níže nepřepíšu nějakou globální proměnou.
Napsal llook;129803
Jaký je rozdíl mezi použitím globální proměnné a globální statické metody?
V tom, že používání globálních proměnných je prostě minulostí a v době oop aplikací nemyslitelné.
18. 10. 2008 23:15:16
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84317
Fuck You
verified
rating uzivatele
(1 hodnocení)
19. 10. 2008 06:59:24
To jsou hloupá dogmata.
Singleton je úplně stejně globální jako globální proměnná. Pokud je zlem všechno globální, pak musí být zlem i názvy tříd, názvy jmenných prostorů apod...
Důvody pro Singleton vidím jenom dva a ani jeden se netýká OOP: Lazy initialization (což v tomto případě bude zbytečné) a použití pomocných nástrojů (např. code completion, PHPXref apod.). Pokud by byly takové požadavky, pak lze obojího dosáhnout i kombinací Registry a Lazy Initialization, což by podle mě bylo daleko vhodnější než Singleton.
19. 10. 2008 06:59:24
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84316
pl4nt
verified
rating uzivatele
20. 10. 2008 01:26:13
Napsal llook;130343
Singleton je úplně stejně globální jako globální proměnná.
Upřímně, téhle větě prostě nerozumím, jak můžeš srovnávat proměnné a návrhový vzor?
Nikdy jsem global nepoužil, takže možná jeho funkčnost chápu špatně, ale já to vidím takto:
global $var;
$var = 15;
class foo
{
public function bar()
{
// Tady se změní 15 na 10?
$var = 10;
}
}
Takto chápu globální proměnné, ale jak říkám, nikdy jsem je nepoužíval a ani se mi nechtělo zkoušet kód, takže možna to je nesmysl...
Napsal llook;130343
Pokud je zlem všechno globální, pak musí být zlem i názvy tříd, názvy jmenných prostorů apod...
Však ty víš jak jsem to myslel, jenom jsi to tak to "politicky" napsal ;)
Samozřejmě prostě nelze změnit název třídy (který je globální), ale velice snadno můžu změnit hodnotu (resp. odstranit) globální proměnné někde hluboko v kódu.
Napsal llook;130343
Lazy initialization (což v tomto případě bude zbytečné)
V tomto ano (pokud se bavíme o situaci, kdy je připojení k db nevyhnutelné), ale na nějakých menší stránkách (např. kontaktní formulář na jinak statickách stránkách) se to může hodit, i když kolik času na dnešních strojích zabere připojení k db a vytvoření objektu...
Napsal llook;130343
pak lze obojího dosáhnout i kombinací Registry a Lazy Initialization, což by podle mě bylo daleko vhodnější než Singleton.
Jistě proč to dělat jednoduše :)
20. 10. 2008 01:26:13
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84315
Fuck You
verified
rating uzivatele
(1 hodnocení)
20. 10. 2008 17:06:09
Napsal pl4nt;130754
Upřímně, téhle větě prostě nerozumím, jak můžeš srovnávat proměnné a návrhový vzor?
Tak to je nedorozumění. Tím Singletonem jsem neměl na mysli návrhový vzor, ale jeho nasazení. Tedy třídu navrženou podle vzoru Singleton, která je v PHP vždy dostupná odkudkoli, protože PHP má pouze veřejné třídy.
Takže jsem srovnával prostředek pro globální zpřístupnění dat (globální proměnné) s jiným prostředkem pro globální zpřístupnění dat.
Nikdy jsem global nepoužil, takže možná jeho funkčnost chápu špatně, ale já to vidím takto:
global $var;
$var = 15;
class foo
{
public function bar()
{
// Tady se změní 15 na 10?
$var = 10;
}
}
Takto chápu globální proměnné, ale jak říkám, nikdy jsem je nepoužíval a ani se mi nechtělo zkoušet kód, takže možna to je nesmysl...
Je to trošku jinak:
$var = 15;
class foo
{
public function bar()
{
// Tady se nic nezmění, protože $var je zde lokální proměnnou.
$var = 10;
}
public function anotherBar()
{
global $var;
// Tady se globální $var změní z 15 na 10, protože $var je označená jako globální.
$var = 10;
}
}
V každé funkci musíš explicitně vyjádřit, které proměnné jsou globální, nebo k nim přistupovat přes superglobální pole $GLOBALS.
Však ty víš jak jsem to myslel, jenom jsi to tak to "politicky" napsal ;)
Samozřejmě prostě nelze změnit název třídy (který je globální), ale velice snadno můžu změnit hodnotu (resp. odstranit) globální proměnné někde hluboko v kódu.
Nejsem si docela jistý, jak jsi to myslel. Myslel jsi to tak, že je špatné, pokud je globálně přístupný nějaký změnitelný objekt?
Pokud ano, tak stejně jako je riziko, že si někde omylem přepíšu globální proměnnou, tak je riziko, že si někde omylem třeba přepnu databázi nebo zapomenu commitnout transakci.
V tomto ano (pokud se bavíme o situaci, kdy je připojení k db nevyhnutelné), ale na nějakých menší stránkách (např. kontaktní formulář na jinak statickách stránkách) se to může hodit, i když kolik času na dnešních strojích zabere připojení k db a vytvoření objektu...
Tenhle požadavek lze řešit na více úrovních. Například Dibi nepřipojuje při vytvoření DibiConnection objektu, ale až při prvním SQL dotazu.
20. 10. 2008 17:06:09
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84314
Zdeněk Topič
verified
rating uzivatele
(2 hodnocení)
21. 10. 2008 13:01:52
Kravina řešit to přes globální proměnné. Vtyvořil bych sis statické metody a dělal bych to stylem Dibi od Davida Grudla (btw, Davide, nechceš vytvořit něco podobného i pro C# .NET? :), uvítal bych to)
21. 10. 2008 13:01:52
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84313
Martin
verified
rating uzivatele
27. 10. 2008 14:46:31
REAKCE :
pan guru je tady!! :)
opravdu obdivuju lidi jako ty, kteří si myslí, že o daném tématu ví všechno (nebo přinejmenším více než kdokoli jiný) a statečně "anonymně" přispívají do těchto diskusí tak bohatými příspěvky jako jsi právě uvedl.
Sám ani přesně nevíš co to globální proměnná je, ale vyjadřuješ se stejně sebejistě jako závodník co se řítí ve 180ti do zatáčky, který do poslední chvíle věří, že to zvládne, ale nakonec si přeje, aby byl býval zbrzdil.
Nebudu ti vysvětlovat, že všechno na světě má své pro a proti, ale poradím ti, abys příště uvážil všechny možnosti (např. nepřeskočil jsem nějakou kapitolu v "začínáme s PHP" ?), než řekneš, že ta jediná je správná - a pokud si myslíš, že je - tak to zkus i vysvětlit ;)
27. 10. 2008 14:46:31
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84312
Svata
verified
rating uzivatele
(3 hodnocení)
28. 10. 2008 17:21:23
Připojím se znovu do diskuze, rád bych si po přečtení těch vzkazů nechal něco vysvětlit.
Když použiji singletonovskou třídu (nevím jak se to správně jmenuje), tak podle toho, co jsem si tu přečetl (a teď snad nebudu za úplného idiota) se při každém volání objektu připojím k databázi (tak jsem pochopil to $db= MyDB::insatance(); ). Nevím nakolik je vhodné pro zátěž, ale časově bych řekl, že to moc dobré nebude.
Pak tu bylo použití globální proměnné. Docela jednoduché, ale člověk musí počítat s povolenými globálními proměnnými - nelze použít všude.
Předávání reference na třídu databáze při každém volání jakékoliv metody spojené s databází (př. ulozitZmenyUzivatele($db); ) - docela šílené pokaždé myslet na databázi.
A nakonec tu padla zmínka používat statických metod. To jsem zkoušel, ale nebyl jsem schopen se natrvalo připojit k databázi. Tato varianta mi přišla nejleší, ale nedokázal jsem se připojit k databázi samotnou třídou (vždycky ta potvůrka chtěla nějaký svůj objekt).
Děkuji za všechny další příspěvky osvětlující problematiku singletonu a statických metod.
28. 10. 2008 17:21:23
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84311
Svata
verified
rating uzivatele
(3 hodnocení)
28. 10. 2008 17:40:20
Právě jsem konečně zprovoznil celou statickou třídu MyDB.
class MyDB{
protected static $mysqli;
static function connect(){
self::$mysqli = @new mysqli("localhost","root","password","database");
if(mysqli_connect_errno())print("tak toto nevyslo");
}
static function execute($sql){
if(self::$mysqli->real_query($sql))return true;
else{
print(self::$mysqli->error);
return false;
}
}
static function select($sql){
if($result = self::$mysqli->query($sql)){
if($result->num_rows){
$i=0;
while($row=$result->fetch_row()){
$vysledek=$row;
$i++;
}
return $vysledek;
}else return FALSE;
}else{
print(self::$mysqli->error);
return FALSE;
}
}
}
Potom použití v jakékoliv třídě je docela jednoduché:
class Obdelnik{
protected $sirka, $vyska;
function __construct($s,$v){
$this->sirka=$s;
$this->vyska=$v;
MyDB::execute("INSERT INTO obdelniky VALUES($this->sirka, $this->vyska)");
}
}
Jenom nesmíme na začátku pozdějšího scriptu napsat:
require_once("MyDB.php");
MyDB::login();
//a dál script pokračuje třeba
require_once("Obdelnik.php");
$jeden=new Obdelnik(10,100);
Snad jsem tu nenasekal moc chyb. Už se docela těším na vaši kritiku :)
28. 10. 2008 17:40:20
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84310
Fuck You
verified
rating uzivatele
(1 hodnocení)
28. 10. 2008 18:51:19
Singleton se vytváří pouze při prvním přístupu. Pěkně popsaný je ten vzor tady: http://objekty.vse.cz/Objekty/Vzory-Singleton Ovšem existuje opodstatněný názor, že Singleton se k tomuto účelu nehodí. Resp. že se nehodí k ničemu: http://phpfashion.com/je-singleton-zlo
Pokud bych se já vracel k PHP, asi bych nevymýšlel kolo a použil bych Dibi: http://dibiphp.com/cs/
28. 10. 2008 18:51:19
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84309
Zdeněk Topič
verified
rating uzivatele
(2 hodnocení)
29. 10. 2008 15:10:08
Ano, statické řešení je podle mého názoru zcela nejlepší a ještě lepší by bylo použít již několikrát zmíněné Dibi od Davida. A singleton jsem snad ještě nikdy nepoužil. Nebyl k tomu opodstatněný důvod.
29. 10. 2008 15:10:08
https://webtrh.cz/diskuse/predavani-objektu-v-php/strana/2#reply84308
Pro odpověď se přihlašte.
Přihlásit