Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako je najbolje resiti nedostatak multiple inheritance u PHPu?

[es] :: PHP :: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?

[ Pregleda: 2279 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.101.*



+4 Profil

icon Kako je najbolje resiti nedostatak multiple inheritance u PHPu?06.11.2009. u 22:47 - pre 176 meseci
Pocetnik sam u PHPu i naisao sam na mali problemcic sa code reusability.

Napravio sam class mysql koja je zduzena za db. Cesto nasledjujem iz nje.
Pa sam napravio tri klase user, mod, admin koje imaju dosta ponavljanja...

Juce sam saznao da PHP ima Object interface i abstract class. U cilju ucenja i (valjda) boljeg nacina programiranja odlucih da napravim jednu abstract class uma koja bi imala sve zajednicke metode od user/mod/admin klasa i onda je samo nasledjujem.

class user extends uma; class admin extends uma;

Sve bi bilo ok da mi ne treba mysql. Ranije sam to radio jednostavnim nasledjivanjem mysql, ali sada to ne moze.

class user extends uma extends mysql :D

Prvo mi je na pamet palo na unutar npr. user klase stavim
public $db;
__construct(){$db=new mysql();}

I dalje koristim $this->db... Ali to mi ne deluje ok. Uz to ide i pitanje kako onda pozivam mysql->insert()?
$this->db->insert() ili je neka gruga sintaksa?

Onda sam pomislio da je mozda moguce praviti neke nizove klasa tipa
class uma extends mysql{}
class user extends uma{}
S tim sto onda uma valjda ne bi mogla da bude apstraktna? Da li je moguce uraditi ovo:
abctract class uma extends mysql{}
Znam da apstraktne ne mogu da se instanciraju...


U medjuvremenu sam nasao i ovo: http://wiki.php.net/rfc/horizontalreuse
Da li je neko koristio trait ili probao da graftuje klase.
U mom slucaju mislim da bi mi samo graft pomogao ali mi se ne mili da u svaku klasu moram da ubacujem
use{pa onda SVE iz mysql klase from novo_f_ime;}

Citao sam i es thread o mvc podeli, pa mogucnosti da se pravi vise klasa za istu logicku celinu. Nije to lose ali za sada bih izbegao te stvari.
Nesto mi se ne mili da imam class userDisplay, userDB, userOvoiono...
Nekako su mi lepse celine. Sve za usera u klasu user, sve za admina u admin class. A 'logicka' mvc podela mi je:
$user=new user;
$user->display();
$user->insert();
$user->njnjnj();

Jos pogotovo sto bi display i insert bili skoro identicni za sve tri klase user mod admin. Samo nemam zelju da ih pravim odvojeno nego da ih nasledim ko covek.

Gresim li? Koja su vasa iskustva na datu temu? Sta je najbolje raditi?
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

agvozden
Aleksandar Gvozden
founder
Info-G
Beograd

Član broj: 37813
Poruke: 1123
93.86.206.*

Sajt: www.gvozden.info


+68 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?06.11.2009. u 23:13 - pre 176 meseci
Ovo sa apstraktnim klasama je relativno novo u php-u, pa nisam stigao da ga prakticno odradim.
Postoji mogucnost nasledjivanja klase preko klase, ali ocigledno da to ne moze da ide preko apstraktne.
Moja praksa je da koristim posebne objekte za klase, jeste apstrakcija, ali ne u OOP modelu, da bih mogao da radim sa raznim bazama.
Objekte koji mi naknadno trebaju iniciram preko reference i uglavnom se radi o singletonima.
pojedinacna klasa za view nasledjuje pojedinacnu klasu za bazu. Mozda gresim, ali daje rezultate.

 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.yu.



+33 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?07.11.2009. u 10:43 - pre 176 meseci
Citat:
agvozden: Postoji mogucnost nasledjivanja klase preko klase, ali ocigledno da to ne moze da ide preko apstraktne.

Ako sam dobro razumeo ovu tvoju rečenicu, onda nisi u pravu, jer ti bilo koju klasu možeš da označiš kao apstraktnu, pa i neku koju izvodiš iz neke ne-apstraktne klase, jer npr. iz nekog razloga možeš da imaš potrebu da ne dozvoliš instanciranje neke klase, al' to su vrlo retki slučajevi. Takođe, klasa može da bude apstraktna čak i ako nema nijedan apstraktan metod.

Ja se odlučujem za apstraktne klase u slučajevima kad znam da ću imati neka zajednička svojstva (bilo članove klase ili metode) za određene klase, i onda sve to što je zajedničko "strpam" u apstraktnu klasu, iz koje se posle izvode neke druge, opciono dodajući neku svoju logiku.

A u situacijama kad imam potrebu da određene klase imaju neko zajedničko "ponašanje", tačnije, samo neki zajednički metod, ili metode, bez zajedničkih članova klase, koristim interfejse. Eto baš skoro sam pravio jednu klasu koje predstavlja API za rad sa DB tabelama rađenim po Nested Set modelu, koja je inače apstraktna. A budući da je zamišljeno da se ona koristi tako što će se iz nje izvesti neka klasa, koja bi definisala ime tabele u bazi sa kojom se radi, imena onih "left" i right "kolona", kao i adapter za komunikaciju sa bazom, ja sam onda u cilju ostavljanja mogućnosti programeru da sam uvede svoj adapter, napravio interfejs koji ta njegova klasa mora da implementira, kako bi mogla da se koristi kao adapter u toj klasi za rad sa Nested Set tabelom.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.101.*



+4 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?07.11.2009. u 20:52 - pre 176 meseci
Nisam bas najbolje razumeo. Da li to znaci da je ovo moguce :
abstract class clName extends someClass {}

Ako koristim interfejs onda prakticno moram da copy/paste kod koji mi treba. Nije bas reusable. Nasledjivanje mi se mnogo vise dopada.

I ja sam hteo da stavim zajednicke metode u apstraktnu klasu i nasledim ih kasnije. Samo sto takode zelim da nasledim i db i jos sto sta...
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.101.*



+4 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?07.11.2009. u 22:45 - pre 176 meseci
Citat:
MilosDjI ja sam hteo da stavim zajednicke metode u apstraktnu klasu i nasledim ih kasnije. Samo sto takode zelim da nasledim i db i jos sto sta...
Sto volim kad se zalepim za novotarije koje sam video pre samo par dana...
Resenje:
Napravim obicnu zajednicku klasu dodam joj mysql i mozda nalepim neki interfejs, onako zezanja radi.
I onda samo nasledjujem tu zajednicku... Vidi se da sam pocetnik

A sto dobro zvuci kad nekom kazes da koristis apstraktne klase sa interfejsom

Hvala na pomoci + izvin'te na maltretiranju
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

agvozden
Aleksandar Gvozden
founder
Info-G
Beograd

Član broj: 37813
Poruke: 1123
93.86.206.*

Sajt: www.gvozden.info


+68 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?08.11.2009. u 01:04 - pre 176 meseci
@MilosDj - nije maltetiranje uopste, sta vise, treba diskutovati o ovim novotarijma u PHP-u i nacinu kako da se to sto bolje iskoristi.
Ali, prakticna vrednost ovoga jesamo kada se kod pise od nule, tesko ce biti to primeniti na vec formiranim sistemima.

 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
91.148.81.*



+13 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?10.11.2009. u 08:34 - pre 176 meseci
@MilosDj - Izvini sto malo kasnim na odgovoru, ali:

1. Naravno da moze apstraktna klasa da nasledi obicnu klasu, odnosno:

Code:


abstract class uma extends mysql
{

}

// Pa onda dalje nasledjujes i implementiras abstraktne metode ...

class admin extends uma, class user extends uma

//..



2. Takodje, naravno da moze i:

Code:

class uma
{
   public uma()
   {
     $this->db = new mysql();
   }

   // I onda pozivas metode iz mysql-a:
   // $this->db->insert();


 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.48.*



+4 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?10.11.2009. u 14:44 - pre 176 meseci
Od smorenog coveka koji ne zna kako da uradi multi inheritance do zbunjenog coveka koji ne zna sta da odabere od mnogo ponudjenih opcija :D
Salu na stranu, hvala svima na pomoci!

U medjuvremenu sam naucio jos po nesto. Pa da postavim pitanje vezano za moj prvi post.
Koji je najboli nacin za mysql? Za sada znam da postoje ovi nacini povezivanja na db:
Code:

1. obican niz funkcija.
 $connection=mysql_connect(DB_SERVER, DB_USER, DB_PASS);
 $select= @mysql_select_db(DB_NAME, $connection);

2. class mysql{
function __construct(){
 $connection=mysql_connect(DB_SERVER, DB_USER, DB_PASS);
 $select= @mysql_select_db(DB_NAME, $connection);
}
}

3. singleton
class mysql{
private function __construct(){}
public function singleton(){
 $connection=mysql_connect(DB_SERVER, DB_USER, DB_PASS);
 $select= @mysql_select_db(DB_NAME, $connection);
}
}
Ima li jos nacina?

Ono sto ja znam:

1:
+ dobar za primere i ucenje.
- Reusability = 0;

2:
+ lako se nasledjuje, sve je tu. jos ako abstract class moze da nasledjuje, milina. Reusability = 1;
- svaka instancirana klasa u script.php koja nasledjuje mysql pravi mali overhead prema mysql servery! mysq_connect nece napraviti novu konekciju pri svakom instanciranju ali mora da proveri ima li stare, kakva je itd, a to zahteva odredjeni protok. (zna li neko koliki tacno?)

3:
+ no overhead, Reusability ~ 1 ali ne kako kod(property+method) nego kao ceo objekat;
- ???, rucno uvlacis $db_objekat svaki put kad ti treba.

Jesam li to dobro shvatio? Ispravite, dopunite, kritikujte ;)
Koliki je tacno __construct() overhead? Vredi li samo zbog toga preci na singleton? U glavi mi stoji da ako imam 10 instanci na strani to je za 9vise poziva na baze od optimalnog. Pa ako se to pomnozi sa kolicinom usera koji koriste taj .php deluje mnogo.
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
91.148.95.*



+13 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?10.11.2009. u 15:01 - pre 176 meseci
Meni se sve nesto cini da si ti previse zakomplikovao celu stvar :-) Zasto jednostavno ne odradis nesto ovako:

1. Prouci MySQLi klasu

2. U toj tvojoj apstraktnoj klasi, napravi staticku referencu na MySQLi:

Code:

abstract class uma {
  public static $db_reference;

  // Konstruktor
  public uma()
  {
    $this->openDbConnection();
  }

  public function open_db_connection()
  {
    if (!is_object(uma::db_reference))
      uma::$db_reference = new mysqli(HOST, USER, PASS, DB);
    else
      return;
  }
}


Sada u uma::$db_reference imas pristup mySqli objektu koji ce se kreirati samo jednom (ako nisam nesto zeznuo pri kucanju :P) ... I onda ga u kodu rokas sa:

Code:

class admin extends uma
{
  // ...
  public function nekaMetoda()
  {
    uma::$db_reference->multi_query(//Neki query); // Npr....
    // ....
   }
// ...
}


Mislim, ovo isto mos da odradis i za mySql klasu, ali, kad vec kreiras klasu za rad sa bazom, sto ne uzmes vec gotovu, koja postoji u PHP-u :-)

P.S. Ne kazem da je ovo najbolji nacin, ali to mi je prvo palo na pamet :-)
 
Odgovor na temu

Nemke_BG

Član broj: 163822
Poruke: 341
..-static.groupsparkmedia.com.

Jabber: Nemke_BG@elitesecurity.org
Sajt: https://www.nmdesign.rs


+45 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?10.11.2009. u 15:04 - pre 176 meseci
ako vec pises kod od nule onda bi mozda bilo dobro da umesto mysql koristis mysqli ekstenziju posto kao sto vidis mysql ekstenzija je samo na "Maintaince Only" modu...

http://us.php.net/manual/en/mysqli.overview.php
...
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.48.*



+4 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?10.11.2009. u 16:02 - pre 176 meseci
Mozda tako izgleda na povrsini, ali ja sam why tip licnosti i nisam u stanju nista da uradim ako ne znam zasto sta, kako i zasto nesto radim
Ne zelim samo da odradim posao. Mnogo mi je znacajnije da naucim sta sve mogu da uradim za bazom, kako to radim, sta je pravilno, optimalno itd.
Znam da postoji mysqli. Srecom ili na zalost poceo sam da ucim PHP uz lynda kurs. Tamo se sve pokazuje uz obican mysql + mysql_real_escape(). Znaci hteo ne, morao sam tako. Sad zelim da shvatim kako zaista radi mysql. Pa kad to razumem onda sve prepravim u mysqli. Mysqli mogu da koristim na dva nacina. Kao klasu ili kao proceduralne funkcije. Tako gledamo ne bi trebalo da bude velike razlike u zameni mysql sa mysqli. Uz neke semanticke razlike za prepared statements...
Prelazim na mysqli cim stigne na red Ovo mi je tek drugi mesec da radim u PHPu

Sada mi je mnogo vaznije da razumem sa cime sve raspolazem i kako da to najbolje iskoristim! Prednosti i mane, best practice, way to go itd. U ostalom, odatle i moj prethodni post koji klasifikuje sve meni znane nacine pristupa bazi. Iskreno se nadam da ce to neko dopuniti.


WoW, nisam znao da mogu da pristupam statickim var iz apstraktne klase! Samo mi ostalo u secanju da ne mogu da je instanciram.

Znaci i ti savetujes singleton db objekat umesto pukog extends mysql!
Dobro, prepravicu moju mysql klasu da postane singleton.

[Ovu poruku je menjao MilosDj dana 11.11.2009. u 00:46 GMT+1]
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
91.148.95.*



+13 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?10.11.2009. u 16:15 - pre 176 meseci
Nemam vremena da ti odgovaram na sve sad, sorry (moram malo i kuci da idem :P), ali, ukratko:

Posa ti je vec pomenuo, al aj i ja da ponovim:

Abstraktna klasa ti nije nista drugacija od obicne klase, osim sto sadrzi neke abstraktne metode koje sub-klase moraju da implementiraju. Shodno tome, mozes da zakljucis:

Citat:

1. Da ne moze da se instancira (sadrzi neke metode koje su samo deklarisane, ali nisu opisane i ne mogu nista da urade)

2. Da njenim clanovima pristupas najnormalnije kao i clanovima obicne klase (ukljucujuci i static clanovima)

3. Abstraktna klasa moze da implementira interfejs(e) (cini mi se da si ovo pitao u nekom proslom postu...)


Btw, vazna napomena: Ne preporucujem ja ovo (sto ne znaci da ne treba da primenis :-D :-D), samo sam ti dao ideju

Pozdrav

 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.48.*



+4 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?11.11.2009. u 00:47 - pre 176 meseci
Tvoji kratki odgovori para vrede!
Posa jeste rekao nesto sto cu najverovatnije razumeti posle godinu dana programiranja u PHPu pod uslovom da imam 4 sajta iza sebe Tvoj odgovor mnogo vise lezi mom 'uzrastu'

Jasna i maksimalno pojednostavljena definicija. Pa jos boldirana da ne moze da mi promakne
I onda ide citat sa 1.2.3. koje fantasticno jasno omedjuju (meni) nepoznat prostor!

A procitao sam celu www.php.net stranu o apstraktnim klasama, googlao, blenuo u neke primere i opet mi nije sve bilo jasno. Previse reci/recenica ume da sakrije sustinu.
Jos kad bi napisao tako nesto o +- za koriscenje obicnog nasledjivanja i singletona za db

Moram priznati da mi je Gvozden prvi pustio buvu za singletona. Pa sam malo varao i poslao mu pp sa pitanjima kako on to radi. Naravno shvatio sam 50% njegovog odgovora i poceo da googlam za ostatkom resenja. I onda mi svanulo kako je web aplikacija jedan veliki krpez pomocu stapa i kanapa u programerskom smislu. Ne postoji kontinuitet u izvrsavanju vise skripti, moras da prenosis vazne podatke u fajlove (cookei, session) ili da ga ubacujes preko linkova ili posta. A sve to zahteva izmenu u kodu i nacinu razmisljanja u odnosu na desktop prg.
Na db sam skroz zaboravio jer trenutno imam xampplite pa mi se cini da je sve tu, ko celina.
Sta ce mi singleton kad je sve to celina, celina, celina... I onda mi sine da su cesto db serveri zasebni kompjuteri, nekad i u odvojenim prostorijama. Da na mom compu postoje apache servis i mysql servis kao dva skroz odvojena entiteta. I kad tako sagledas celinu, ne mozes da ne vidis koliko je vazno da se optimizuje taj sql upit, da se smanji svaki overhead (singleton) i uradi jos 5 stvari za koje ne znam ni da postoje.

Nisam ni lenj ni glup, samo cesto ne znam sta je gore a sta dole u PHP svetu, ne razlikujem nebo od mora jer su oba plava i tako neke vama banalne

p.s. sto vise razmisljam, taj overhead nije toliko zanemarljiv. Web kao minimum mora da posalje HOST, USER, PASS, DB i jos makar jedan parametar da se identifikuje kod mysql servera. Pa my mysql odgovori sa novom ili postojecom konekcijom.
taj protok x br. poziva po skripti x br. usera
+ nacin kako db obradjuje te zahteve (koliko moze da ih obradi paralelno, koliko vremenski kostaju ti zahtevi itd.
Zna li neko detaljnije kako web i mysql komuniciraju?

I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.48.*



+4 Profil

icon Re: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?11.11.2009. u 17:08 - pre 176 meseci
Izmedju singleton: mysqli procedural, mysqli object oriented i PDO izabrao sam PDO.
Time to work.

Hvala svima na pomoci.
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

[es] :: PHP :: Kako je najbolje resiti nedostatak multiple inheritance u PHPu?

[ Pregleda: 2279 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.