Gå til innhold

OOP - Nybegynner spørsmål


Anbefalte innlegg

Hei, har idag begynt å lese litt om OOP. Jeg har lest veldig mange tutorials, og hver eneste tutorial tar for seg mennesker og hunder, og at man kan gi dem funksjoner som å presentere seg selv og bjeffe.

 

Mitt spørsmål da, er om noen kan gi meg eksempler på hvordan man bruker det i PHP, f.eks. om man skal lage et brukersystem osv. Hva er objektet, hvilke funksjoner har det?

 

Og en ting til: Skal man programmere OO alltid, eller skal det kun brukes der det trengs?

Lenke til kommentar
Videoannonse
Annonse

Jeg tror at skal du lage et brukersystem må du først definere hva et brukersystem skal gjøre. Hvis man definerer et brukersystem som en bruker skal autentiseres og logge inn så ville jeg hatt fire klasser, user, authentication_manager, session_manager (for å holde orden på innloggingen) og en databaseklasse.

 

Så må man tenke hva de ulike delene av systemet skal gjøre. User holder orden på en bruker med kanskje brukernavn, passord, rettigheter, status osv etc, authentication_manager bruker kanskje et db-objekt for å finne ut om et brukernavn og passord finnes finnes i databasen og hvis den gjør kan den opprette en bruker u og videre bruke et session_objekt og slenger hele user u i en session-variabel.... noe slikt. Authentication_manager kan også innehold alt du vanligvis ville lagt i en session.

 

Om det er riktig å bruke objekter til alt tror jeg er en avveiing. Jeg syns objekter er enklere å forholde meg til enn en rekke variabler løsrevet fra kontekst.

Lenke til kommentar

Programmerer du OOP, bør du holde deg til OOP igjennom hele programmet/scriptet ja. Sikkert noen som er uenige her, men jeg mener ihvertfall det.

 

Hva en brukerklasse bør inneholde, vil du måtte tilpasse etter de metodene du trenger rett og slett.

 

Sender noe kode jeg har liggende for å registrere brukere, dette er skrevet i forbindelse med et cms jeg har utviklet i PHP og xml.

Lenke til kommentar

Takk, haingodegamle, skal ta en titt. Helt i starten i dag, da jeg hadde lest hva OOP var så prøvde jeg meg selv, men fikk beskjed om at dette var totalt feil og at jeg måtte prøve på nytt. Men når jeg har lest mer, så ser jeg at det er flere som gjør det samme som meg.

 

Kan jeg få høre hva dere mener?

 

Kode

Endret av banansplitt
Lenke til kommentar

En av prinsippene med objektorientert programmering er modularisering, dvs å dele koden opp i enheter som henger sammen. En måte å modularisere på er at hver funksjon gjør en oppgave (feks utfører en spørring, oppretter en bruker, lagrer en session osv). Å ha en klasse som har en funksjon som gjør alt er prosedyrell programmering i forkledning.

 

Et return-statement avbryter koden der den er, så det er ikke nødvendig å ha en else(else if) etter en return, siden hvis koden returnerer kommer den aldri dit.

Lenke til kommentar
En av prinsippene med objektorientert programmering er modularisering, dvs å dele koden opp i enheter som henger sammen. En måte å modularisere på er at hver funksjon gjør en oppgave (feks utfører en spørring, oppretter en bruker, lagrer en session osv). Å ha en klasse som har en funksjon som gjør alt er prosedyrell programmering i forkledning.

 

Nei, OOP er mer enn prosedyrell programmering i forkledning. Kan si det som at OOP hever seg to hakk over funksjoner og bytter dem ut med objekter, hvor hvert objekt representerer et bestemt komponent i programmet og har forskjellige metoder den kan håndteres på.

Den kanskje største fordelen til OOP er måten deler av komponentene/objektene kan endres og gjenbrukes. Det er utrolig hvor mye kode som i bunn og grunn blir den samme vis man ikke følger gode OOP-prinsipper.

Mange som har skrevet side etter side for å forklare OOP men det er vanskelig å forstå med en gang, det tar tid og må rett og slett oppleves.

I tillegg til å lese noe teori anbefaler jeg å se på god OOP-kode og ta den i bruk, for PHP så er det begrenset hva som finnes på det området siden alt for mange PHP-prosjekter er av sørgelig kvalitet, men man bør se på Zend FW (framework.zend.com) som blir skrevet av flere av de aller fremste PHP-guruene etter veldig gode designprinsipper. Se hvordan komponentene er bygd opp og hvordan det er lagt opp til å konstruere programmene sine etter MVC-prinsippet.

Nok en gang: Dette tar tid, ikke tro at man har lært OOP etter et par måneder, men det er en grunn til at så godt som alle seriøse utviklere nesten uansett språk sverger til OOP.

Lenke til kommentar

Jeg sa at en klasse som gjør en ting er prosedyrell i forkledning, ikke at det var oop. Å ha en klasse med en funksjon som både sjekker brukernavn og passord, logger inn brukere, skriver ut feilmeldinger, lager en session, registrerer en bruker er en klasse som gjør alt for mye og bør modulariseres. Det var det jeg mente, om enn uklart forklart.

Lenke til kommentar

Skjønte nok hva du mente... Posten var mest ment som et generelt svar til trådstarter, selv som jeg ser det kom litt skjevt ut.

Ikke for det, du bør virkelig ta en titt på rådene du også, er virkelig mye og lære på den måten.

Ser at du har forstått noen av grunnprinsippene, men fortsatt har en lang vei igjen - en vei som vertfall for meg ble drastisk kortet ned ved å se på andre flinke utvikleres arbeid og benytte meg av det.

Absolutt no offense, men et godt råd.

Lenke til kommentar

Synes det var veldig fin kode du postet, CruellaDeVillem, men jeg reagerte på at du ved ett (eller flere) mysql-kall brukte "or die()". Dette er en konstruksjon jeg er veldig imot, ettersom jeg mener det er mye bedre å kaste exception når du først skal skrive OO kode. I tillegg så er jeg ikke helt enig i at user eller db er en error_manager, slik koden din sier.

Lenke til kommentar
Kan du poste noe kode hvor man kaster exception? Jeg har aldri brukt det i php. Og ville det vært bedre hvis db/ user bruker et error_manager-objekt?

8234037[/snapback]

Man kaster exceptions akkurat som i Java. throw new Exception( "beskjed" );

Mer om exceptions in PHP her: http://no2.php.net/exceptions

 

Og ja, jeg ville sagt at det var bedre at db og user bruker et error_manager-objekt, ettersom de ikke er noen error_manager. Det er ikke sikkert dette er riktig, men jeg ville ihvertfall tenkt slik i andre språk som Java eller C++.

Lenke til kommentar

Når vi er inne på databaser og exceptions blir livet MYE enklere vis man bruker en database-link som sørger for å kaste exceptions selv. For eksempel er følgende kode veldig tungvindt selv om den er utrolig mye brukt:

if(!$res = mysql_query('SELECT something FROM somewhere')) {
  // Some sort error-handling...
}
// continue...

Bruker man en database-link med exceptions, kan man like gjerne gjøre sånn her:

$res = $db->query('SELECT something FROM somewhere');
// no need for extra error-handling, just continue!

 

PDO (php.net/manual/en/ref.pdo.php) sørger for å kaste exceptions når noe går feil og er nok den beste måten å koble til en database på i PHP, men kan man ikke bruke PDO av en eller annen grunn går det fint å lage sin egen wrapper rundt f.eks ext/mysql som sørger for å exceptions blir kastet når noe går feil.

Kan sikkert poste eksempel-kode for dette vis noen vil.

Lenke til kommentar

Dette temaet er veldig interessant! Jeg føler at objektorienteringen min i PHP skurrer litt og vil gjerne bli bedre.

 

Et av poengene med klasser er vel at klasser kan arve egenskaper av andre klasser, f.eks kan man lage en klasse "mann" og en klasse "kvinne" som begge arver egenskapene til klassen "person".

 

Dessuten kan man lage mange objekter av en klasse, f.eks om man har 43 personer i et program kan man lage 43 objekter av klassen person, alle med forskjellige verdier.

 

Det jeg lurer på er hvordan det er riktig å gjøre selve start-filen, den som inkluderer andre klasser og lager objekter av dem. Bør man kun lage et object, eller er det greit med en fil som kaller litt flere objekter og metoder i disse objektene. I java har man main(), har man noe lignende i PHP?

Lenke til kommentar

tja...

 

Jeg har lagt en base klasse for selve websiden. Den er aldeles enkel, men har funksjoner for å sjekke om bruker er innlogget. Så arver jeg fra base klassen og legger opp den generelle html koden som skal vises. Altså den html/css biten som er lik på alle sider. Så arver eg igjenn fra den klassen og putter inn tekst, forms, whatever. Det er jo her jeg legger inn login boksen, og den sjekker jo kun med variabler som er i baseklassen om den er innlogget eller ikke ....

 

Dette er en måte å gjøre ting på med oo

 

Jeg har også egne objekter for hver tabell i databasen. Objektet har da spesialiserte rutiner for å hente/slette/oppdatere mot spesifikk tabell. Så har jeg dataobjekter som representerer en rad i tabellen. Dette kunne jeg sikkert ha gjort bedre med å ha en base klasse med standard funksjoner som jeg arvet og fyllte inn med spesielle funksjoner. Da får man jo et mer enhetlig interface når man lager nye tabeller etc

 

mye rart man kan gjøre med oo .... det er bare å prøve og leke. Det er ikke noe fasit egentlig. Så lenge det er orden og struktur, og du kan rettferdiggjøre bruk av oo (gjennbruk, forenkling etc) så er det shit the same. Om noen syter på at ting går treigt, så er det bare å hente en profiler (tror xdebug har), og se hvor treigt ting går.

Lenke til kommentar

Tja, la merke til at når du skal hente opp noe fra databasen skriver du $this->res. Det er ikke riktig, fordi "res" er en variabel som tilhører en av funksjonene dine, ikke klassen. Du må ha den sammen med de to andre varablene dine hvis det skal virke, altså de som er deklarert public på toppen. Men skjønner ikke hvorfor du skal ha de variablene public, sett dem til private slik at variablene bare tilhører innenfor denne klassen, så kan du heller lage funksjoner som returner dem. Jeg bruker mest java, og derfra er jeg vandt til å sette nesten alle variabler som tilhører klassen til private, for så og lage funksjoner som gjør det mulig og hente disse verdiene utenfor klassen også. F.eks slik:

 

public function getAuthor() {
 return $this->author;
}
public function setAuthor($newAuthor) {
 $this->author = $newAuthor;
}

 

I eksemplene ovenfor er typiske get og set funksjoner som er mye brukt i OOP. Get-funksjonen returnerer $author som er deklarert til klassen, og setAuthor gir klassens $author et nytt navn.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...