Lidt mere om klasser...

Tags:    php
Skrevet af Bruger #4683 @ 05.08.2004
Klasser er en meget anvendelig del af PHP, og det sætter én i stand til at lave en meget effektiv kode. Klasser er en del af OOP - det ER IKKE OOP!

Tanken bag klasser er meget elegant, og jeg vil prøve at fortælle lidt om den først.

Tanken bag klasse
Som sagt er ideen bag klasser meget elegant, og den tager udgangspunkt i de objekter der omgiver os i hverdagen. F.eks. en bil, en telefon, osv. Vi behøver ikke vide alt om en bil for at køre i den, vi skal bare vide hvor pedaler, rat, osv. er. Med andre ord skal vi ikke vide så meget om den mekanik der anvendes for at få en bil til at køre.
Det er det samme med interne PHP-funktioner - vi ved (sandsynligvis) ikke hvordan de fungerer, men vi ved hvordan de skal bruges - hvilke argumenter funktionen bruger og hvilke info funktionen returnere. Det kaldes abstraktion.
Et andet eksempel er en telefon. Telefoner gør det samme - de gør os i stand til at snakke sammen. Måde de gør det på kan være forskellig, men deres "interface" er ens (kapper, telefonrør,osv). Det kaldes indkapsling.
Hvis man køber en trådløs telefon, vil man sandsynligvis være i stand til at bruge den selvom den fungerer på en anden måde end en stationær. Man kan sige at en trådløs arver nogle egenskaber fra en "normal" telefon, og bygger videre på de egenskaber. Dette kaldes arv.

Klasser blev indført for at kunne anvende disse tre koncepter, abstraktion, indkapsling og arv, i programmering.

Hvorfor bruge OOP
Der er mange gode grunde til at anvende OOP i din kode, hvilket da også er grunden til at det er så udbredt overalt i programmering. En lille liste med gode grunde er vist herunder (der er sikkert mange mange flere):

- Du behøver ikke skrive den samme kode flere gange! Dette kan normalt klares med funktioner, men man kommer ofte ud for at flere funktioner bruger samme variabel. Du skal altså sende variablen i funktionens argument hvergang = ikke effektivt!! (kan også klares med globale variabler, men så skal du huske navnet på dem)

- Det er nemmere at koordinere arbejde mellem flere programmører når man anvender OOP (indkapsling). De enkelte programmører skal nemlig ikke tænke på at benytte de samme variabelnavne, men blot huske det interface der er vedtaget i koden.

- Man kan nemmere udbygge koden. Man skal ikke skrive det hele om, blot udbygge.

Hvad er en klasse?
En klasse er en skabelon til et objekt! Klassen indeholder de egenskaber og metoder der skal beskrive objektet. F.eks. kunne en bil-klasse indeholde egenskaber der beskrive størrelse, farve, antal døre, osv - og metoder der beskriver hvordan motoren udfører dens arbejde, hvordan bremserne virker, osv.

Hvad er et objekt?
Som tidligere nævnt er en klasse en skabelon til et objekt, og objekter kaldes instanser af en klasse. Umiddelbart lyder det lidt underligt, men det bliver forklaret nærmere senere!

Klasser - definitionen

Klasser har en syntax der minder meget om funktioners. I stedet for "function" foran funktionsnavnet, skriver man class foran klassenavnet.

Et eksempel
Da der findes andre artikler om hvordan klasser defineres, vil jeg ikke gå så meget ind i det...
Fold kodeboks ind/udKode 

Det var meget på én gang, men det er meget simpelt. Først, klassen Bil starter med stort B - det er meget almindeligt for klasser. Det er en god regl at lære, for det er meget udbredt.
Klasse Bil indeholder kun én egenskab - pris. Det er en variabel der indeholder bilens pris. Læg mærke til at variablen skal defineres med var som ellers ikke anvendes i PHP. Klassen indeholder 3 metoder (funktioner), en konstruktør, en funktion der ændre prisen og en funktion der viser prisen. Syntaxen $this->variabe er karakteristisk for klasser, og folk der har kendskab til f.eks. C++ genkender det. $this kan siges at være en pointer til variblen i klassen. Det eneste den gør er, at pege på variablen - det skal man ikke tænke så meget på.. :)
Efter klassen oprettes et objekt (instace) af klassen med nøgleordet new. Objektet lægges i en variabel der hedder $bil. De enkelte dele af objektet kaldes med $bil->metode. Her kan man også bare betragte $bil som en pointer til objektet. Det er værd at lægge mærke til at den første funktion i klassen hedder det samme som klassen selv - derfor hedder den en konstruktør. Konstruktøren kaldes hver gang der oprettes et nyt objekt af klassen. Det betyder at ved oprettelsen $bil = new Bil sættes pris til 300000 som startværdi. I linie 2 kaldes vis_pris() som viser prisen. Den tager ingen argumenter. I linie 3 kaldes new_pris(arg) der tager den nye pris som argument. Sidste kaldes vis_pris() igen. Koden har følgende output:

Pris: 300000
Pris: 200000


Der var jo ikke noget uventet ved denne klasse. Endnu et eksempel kunne være:
Et eksempel
Fold kodeboks ind/udKode 

Her er der sket nogle få ændringer. Klasse er næsten den samme, men der er tilføjet en egenskab mere, bilens hestekræfter. Funktionen new_data ændre bilens egenskaber, men det "sjove" er at det er valgfrit om man vil ændre bilens hestekræfter. Hvis man kun giver funktionen ét argument vil det være prisen, og hk vil forblive 100. Hvis man giver den 2 argumenter vil det første være prisen og den anden være hestekræfterne. Det er vigtigt, at de valgfri argumenter placeres til højre i funktions definitionen. Kodens output er:

Pris: 300000 HK: 100
Pris: 200000 HK: 100
Pris: 400000 HK: 200


Det er meget anvendeligt at kunne variere antallet af argumenter til en funktion. Jeg mener at det hedder at overloade en funktion - men det vil jeg ikke hænges op på :)
Hvis man har en klasse, som vores Bil, men man ønsker at udbygge den, kan det gøre med arv. Arv er som det lyder - arv af egenskaber og metoder mellem klasser.
Et eksempel på arv
Fold kodeboks ind/udKode 


Her sker der lidt. Ud over klassen Bil, laver vi en ny - Mere_bil. Den nye klasse anvender nøgleordet extends, som fortæller at den skal arve alt fra Bil-klassen. I linie 1 oprettes et objekt af Mere_bil, og linie 2-6 er som tidligere, dog er det jo et objekt af Mere_bil der kalder funktioner i Bil - der er muligt fordi Mere_bil arve egenskaber og metoder af Bil. Linie 7 og 8 kalder funktioner i Mere_bil og outputtet bliver:

Pris: 300000 HK: 100
Pris: 200000 HK: 100
Pris: 400000 HK: 200
Farve: Blå

Klasse Bil siges at være parent (forældre) klasse til Mere_bil, som igen er child (barn) til Bil. Det er vigtigt at nævne at forældreklasse IKKE arver egenskaber fra barneklassen! Dvs. at havde vi lavet et objekt af Bil ($bil = new Bil) kunne vi ikke kalde new_farve og vis_farve (linie 7 og 8)!
Det er også værd at lægge mærke til, at forældreklassens konstruktør kaldes selvom vi kun opretter et objekt af barneklassen. Havde vi lavet en konstruktør i barneklassen, ville den blive kaldt i stedet for konstruktøren i forældreklassen.

Der er meget mere at sige om klasser og objekter, men jeg ved ikke om der er stemning for mere?



Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (9)

User
Bruger #4899 @ 07.08.04 12:41
en fin nok artikel, men måske ville det være en ide at have skrevet om PHP5 istedet, da du egentligt ikke kan lave OO i PHP4, og PHP5's klasse/objekt model er langt mere gennemført.
User
Bruger #5062 @ 07.08.04 19:37
Hmm... Fed nok artikel, men stadig lidt ubrugelig eftersom de fleste kun vil læse om php5, da det jo er det nye.. Fra min side kan man ikke bruge den, men ellers er det en god nok artikel
User
Bruger #485 @ 21.08.04 12:22
Jeppe Andersen & Esben Søndergaard , Hvad snakker I om ?? Tror lige at I skal læse lidt mere om PHP før i begynder at siger at man ikke kan bruge OOP i PHP4 eller at man ikke den bruge en OOP artikel som er i PHP4 til PHP5.

Og det som PHP5 har med sig af OOP er heller ikke det helt vilde.. Hvis man skal bruge OOP så skal man læse om rigtig programmerings sprog og ikke web-sprog som PHP,ASP og sådan nogte..
User
Bruger #4899 @ 26.08.04 22:32
Hej smooth

Tror ikke du forstår mig helt :)
I PHP4 har du ikke fuldt ud mulighed for at lave rigtigt objekt orienteret kode, hvilket du har i PHP5!
Derfor mener jeg at det eventuelt burde have været mere udbytterigt at lave en artikel om OO i PHP5! Jeg siger ikke din artikel er direkte dårlig.

Og det har ikke noget at gøre med om man har brugt PHP i 1 år eller 5 år - lad være med at tage det som et direkte angreb, det er bare konstruktiv kritik :)
User
Bruger #4683 @ 27.08.04 15:27
Hej Jeppe.
Det er vist mig der har skrevet artiklen, og jeg har ikke sagt noget :)
User
Bruger #2320 @ 28.09.04 11:13
Kanon artikel.. Du forklare tingene virkeligt godt på meget kort tid.. Smukt arbejde, meget bedre end tykke og langtrukne bøger selvom de går mere i dybden, har din artikel de vigtigste ting med...

Mange takker for artiklen og jeg vil gerne se mere fra din side, så stemningen er hel i top mht. flere artikler om emnet!
User
Bruger #6731 @ 19.05.05 17:47
Håber jeg ka' huske det:D
User
Bruger #8431 @ 10.11.05 14:29
4 her fra
User
Bruger #7326 @ 27.12.05 02:46
Har stadig ikke forstået pointen i det med at bruge klasser, men har også først lært funktioner idag. så det kommer vel. ;)
Du skal være logget ind for at skrive en kommentar.
t