Method Overloading

Tags:    php
Skrevet af Bruger #6653 @ 13.08.2006
Member Overloading


Denne artikel beskriver, hvordan man kan skjule funktioner til at få og ændre klassevariabler med. På den måde kan man få en pænere og mere stilren kode. Artiklen forudsætter grundlæggende kendskab til objektorientering i PHP.

Problemstilling


I kun meget simple eksempler vil man deklarere en variabel som public. Men bliver det blot en anelse mere avanceret, vil man deklarere variablen som protected eller private og lave funktioner til at få og ændre variablen. Følg eksemplet:

Fold kodeboks ind/udKode 


Fordelen ved denne metode er, at man kan validere værdierne i funktionerne. På den måde har man kontrol over både hvilken type og kvliken værdi, variablen har, og det er ikke blot en fordel, men mange steder er det også nødvendigt. Ulempen er dog, at man skal kalde to forskellige funktioner for henholdsvis at få variablen og at ændre variablen. Det kan muligvis skabe forvirring, og det ser mindre pænt ud i kildekoden. Derfor er denne metode ikke at foretrække.

Metoden, der er at foretrække, kaldes member overloading. Med denne metode kaldes en bestemt funktion, når man forsøger at kalde en variabel, som ikke findes. Det er vigtigt at huske, at member overloading kun kan lade sig gøre, hvis den kaldede variabel er usynlig eller ikke findes. Derfor skal variablen være usynlig uden for klassen. Se dette eksempel:

Fold kodeboks ind/udKode 


Funktioner til løsning


I eksemplerne nedenfor bruger jeg bl.a. disse to funktioner. Uddybende dokumentation om disse og andre brugte funktioner findes i dokumentationen til PHP.

__get(string $name): $name er navnet på den variabel, scriptet forsøger at hente.
__set(string $name, string $value): $name er navnet på den variabel, scriptet orsøger at ændre til værdien af $value.

Eksempel 1


Der arbejdes direkte med variablen:

Fold kodeboks ind/udKode 


Eksempel 2


Der arbejdes med variablen gennem funktioner:

Fold kodeboks ind/udKode 



Eksempel 3


Det kan kombineres på utallige måder:

Fold kodeboks ind/udKode 


Efterskrift


Jeg er af den overbevisning, at objektorienteret programmering er kommet for at blive. Endvidere ved jeg, at member overloading allerede findes i en lang række eksisterende programmeringssprog. Objektorientering eksisterede på et meget lavt plan i PHP4, men med version 5 blev mange nye ting introduceret - bl.a. member overloading.

Det var mit mål, at denne artikel kan bruges som guide til member overloading, og som appetitvækker til mange af den andre spændende ting, PHP5 har at byde på gennem sin objektorienterede del. Til sidst vil jeg anbefale dig at gå på opdagelse i dokumentationen til PHP. Dokumentationen er ikke svært tilgængelig, og den indeholder forklaringer, faktabokse, eksempler og et register, så den er let at bruge. Tak for opmærksomheden og god lærelyst.

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 (5)

User
Bruger #5620 @ 13.08.06 22:05
Synes det en god artikel dog lidt underligt at den har overskrften Method Overloading og ikke Member Overloading. Og jeg finder det yderst suspect at du siger at variablen height er skrivebeskyttet når denne i sandhed ikke er en variable da den slet ikke er defineret i din class men er derimod en constant værdi kodet direkte ind i set metoden.
Endvidere ville jeg mene at bruge __set og __get på om en property exist og så sætte denne property eller returnere den fuldkommen ødelægger hele ideen med at gøre properties private da dette jo gør dem public. Og synes måske også du burde have nævnt det indlysende at brug af __set og __get uanset hvad du bruger dem til på fører et ekstra brug af computer kraft og tid i stedet for at bruge de funktionaliteter som du prøver at gøre let tilgængelige det værende metoder eller variabler.
User
Bruger #4683 @ 14.08.06 14:24
Udemærket artikel, dog vil jeg knytte en lille advarsel til brugen af __get og __set.

Selvom __get og __set kan virke meget brugbare og relativt "nemme" og implementere, vil jeg mene at brugen af dem skal holdes på et absolut minimum. Man ender meget hurtigt med noget kode, som er tæt på umuligt at debugge.

User
Bruger #8985 @ 23.09.06 10:08
class Example
{
public $name = 'Eric';
protected $age = 90;
}

$ex = new ExampleTwo; // opret objektet


Har du afprøvet dine koder før du har skrevet dem med i artiklen? Din klasse skulle hedde ExampleTwo og ikke Example, så vidt jeg kan se, men det er selvfølgelig en af de små daglidags fejl man begår ;)
User
Bruger #5800 @ 17.10.06 20:25
tjaah.. du bruger jo overhovedet ikke noget som har med overloading at gøre. Du viser jo bare brugen af 2 magiske metoder.

www.php.net/overloading :) enjoy
User
Bruger #4315 @ 06.12.06 12:09
Det handler ikke om brug af overloading, og jeg vil give JT ret i at det er svært at debugge. lav istedet private og protected variabler og lav specifikke funktioner til at sætte de enkelte variabler, det er pænere og meget lettere at debugge.
Du skal være logget ind for at skrive en kommentar.
t