Klasser i php

Tags:    php oop class

Hejsa.

Nu har jeg været syg nogle dage og har brugt min vågne tid på at læse en del om oop. Jeg tror jeg er ved at have en forståelse for hvordan det egentlig hænger sammen er det er faktisk også ganske smart.

Nu kommer mit næste problem så.
Hvordan skal jeg definere klasserne.

Pt har jeg følgende dele af mit system, men kan jeg samle det i færre klasser eller bør jeg lave en klasse til hver af delene:
- Logind / Glemt password mm.
- Dommer (Her skal der oprettes og hentes data fra db, samt filer).
- Filer (Dette er flere slået sammen, regninger, forsikring, telefon osv.)
- Burgere (Oprettelse, blokering, slette osv.)
- Film (Filmliste samt hvem der har lånt film)
- Kontakter (Liste, slette, oprette)
- PM system

Det er blot et udpluk.

Er der nogen der kan fortælle mig hvordan jeg bør gøre det? For umiddelbart så gøre Brugere, Film og Kontakter jo stort set det samme.

Hvor skal jeg placere min connection til databasen og skal jeg lave en connection->query(); som jeg bruge til at udføre forskellige quries?




Indlæg senest redigeret d. 20.11.2012 17:13 af Bruger #15663
5 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
Umiddelbart vil jeg sige at du aldrig kan have for mange klasser.
Forsøg at give hver klasse ét ansvar. To forskellige opgaver bør varetages af to forskellige klasser.

Hold dem så små og overskuelige som muligt, og prøv at få dem til at stå så meget alene som muligt, så du ikke skal instantiere alt i dit system, for at se, om én klasse fungerer.



Det var også min tanke for at holde det overskueligt.

Men hvordan gør jeg så med en connection.
Ville det ikke være lidt dumt at lave en connection i hver eneste klasse?



Well, det kommer an på hvad en Connection er.
Men nu er det ikke alle klasser, som har ansvar for at præsentere noget for brugeren. Nogen har kun ansvar for at finde et eller andet i databasen.

Et lille eksempel kunne være følgende:
Fold kodeboks ind/udPHP kode 


Jeg har ikke testet ovenstående, men det illustrerer nok, hvad jeg mener. Jeg benytter to design patterns, som ofte arbejder sammen, kaldet Transfer Object og Data Access Object (Google dem).

UserDAO har ansvaret for at oprette og finde bruger objekter fra én eller anden form for baggrundslager. Det kunne være en database, det kunne være XML, det kunne være Facebooks API.

Den skal derimod ikke autentificere eller vise en "Opret bruger" formular. Den ved ikke, hvordan et brugerobjekt skal præsenteres for brugerne. Den slags ligger i en anden klasse.

Tag evt. et kig på MVC design mønstret: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
Det er en meget brugt opdeling af ansvarsområder i software udvikling.



Jeg beklager.

Men der stod jeg sku godt nok af.

Jeg har af flere omgange kigget på MVC.
Problemet med det er at jeg ikke fatter en skid.
I mit hoved når det kommer til MVC så lyder det nogenlunde sådan her:
Så laver vi lige lidt her så hopper vi herover, så hopper vi til et tredje sted også hopper vi tilbage igen og gentager proccessen to gange mere.


Den connection jeg taler om er connection til databasen.



Tænk over det som et firma med produktion, ledelse og sælgere.

Folkene i produktionen får ikke lov til at møde kunder. Sælgerne kunne aldrig finde på at risikere at få olie på tøjet og lederne binder det hele sammen og har overblikket.

Produktionen er yderligere delt op i dem som bygger enkelt dele, og dem som samler delene til en større helhed.

Sælgerne er delt op efter landegrænser. Nogle har kendskab til det danske marked, andre på det russiske og andre igen på England. De blander sig ikke i hinandens områder, men de udfører stort set det samme arbejde.

Det er det samme med MVC. Stærk opdeling af ansvarsområder, og det kode, jeg viste, har vi en klasse (UserDAO). Den har ikke forstand på at snakke med brugeren (læse $_POST, $_GET og 'echo'). Til gengæld har den fuldstændig styr på, hvordan man "producerer" bruger objekter. Ande klasser i "produktionen" kunne oprette/slette/søge efter film.

En UserDAO og en FilmDAO gør ca. det samme....de opretter, modificerer og søger efter en type objekter, men helt præcis hvilke objekter, de arbejder med, det er dér de er forskellige.

Objekt orientering er ikke noget, som giver fuld mening, før man har brugt det et godt stykke tid, så hvis du NÆSTEN har forstået meningen, så er det ikke sikkert, at du er klar til de helt store OO arkitektoniske patterns...men fortsæt kampen, for det er dét værd.

Måske andre kan forklare det bedre en mig?

Forbindelsen til databasen kan deles mellem klasserne. Giv den med i constructoren, som jeg gjorde. En PDO er en database abstraktions klasse, som giver et éns interface til alle DBMS'er, som der er PDO drivere til (temmelig mange), men du kunne også dele en MySQL ressource, hvis du hellere vil det.



t