Een abstracte klasse kan je niet instantiëren, hoewel er wel functies inzitten. Je kan deze functies enkel aanroepen door de abstracte klasse met andere klasses te extenden.
<?php
abstract class dier
{
abstract public function blaffen();
public function eten()
{
echo "Het dier eet";
}
}
class hond extends dier
{
public function blaffen()
{
echo "De hond blaft";
}
}
// De klasse "hond" aanroepen
$dier = new hond;
$dier->blaffen(); // dit zal "De hond blaft" weergeven
$dier->blaffen(); // dit zal "Het dier eet" weergeven
// De klasse "dier" aanroepen
$dier = new dier; // Dit zal niet werken, want het is een abstracte klasse
$dier->eten();
?>
$dier->blaffen();// dit zal "De hond blaft" weergeven
$dier->blaffen();// dit zal "Het dier eet" weergeven
// De klasse "dier" aanroepen
$dier=new dier;// Dit zal niet werken, want het is een abstracte klasse
$dier->eten();
?>
Een interface legt de functies die gebruikt worden in een klasse (of meerdere klasses), vast => polymorfie. Je kan, net zoals bij abstracte klasses, een functie uit een interface niet instantiëren.
$klasse = new klasse ;
$klasse->test();
(waar bij klasse een interface is, en test een functie) zal dus niet werken.
<?php
interface dier
{
function eten();
}
class hond implements dier
{
public function eten()
{
echo "De hond eet";
}
}
class kat implements dier
{
public function eten()
{
echo "De kat eet";
}
}
// De klasse "hond" aanroepen
$dier_h = new hond;
$dier_h->eten(); // zal "De hond eet" weergeven
// De klasse "kat" aanroepen
$dier_k = new kat;
$dier_k->eten(); // zal "De kat eet" weergeven"
?>
Een abstracte klasse kan je niet instantiëren, hoewel er wel functies inzitten. Je kan deze functies enkel aanroepen door de abstracte klasse met andere klasses te extenden.
Een voorbeeld in php:
[..code..]
Een interface legt de functies die gebruikt worden in een klasse (of meerdere klasses), vast => polymorfie. Je kan, net zoals bij abstracte klasses, een functie uit een interface niet instantiëren.
$klasse = new klasse ;
$klasse->test();
(waar bij klasse een interface is, en test een functie) zal dus niet werken.
Opnieuw een voorbeeld in php:
[..code..]
Ik hoop dat je hier wat aan hebt, lees zeker de link naar de PHP-website eens na.
Als aanvulling.
Bij abstracte klasse kan je nu ook blaffen aanroepen, maar dan zo.
Verder een opmerking, in een klasse probeer je natuurlijk "echo" (en print) te vermijden, tenzij je het ECHT nodig hebt (nooit dus). Scheelt een hoop header fouten =]
in een abstracte klasse kan je een functie "bouwen", dus elementen toevoegen. Je kan ze alleen niet (rechtstreeks) gebruiken. In een interface definieer je alleen de klasses zonder er verder iets mee te doen, dat doe je in andere klasses.
haha, dat is iets wat ik mezelf ook heel dikwijls afvraag
ik gebruik meestal gewone klasses, maar bv om constanten te definiëren die je in een andere klasse gaat gebruiken is een interface wel handig omdat je daar ook constanten in kan definiëren (aan de andere meer gevordere gebruikers hiervan: correct me if i'm wrong!!).
een abstracte klasse kan je gebruiken als je functies wil maken die je enkel via andere klasses wil kunnen aanroepen.
Wel zo'n interface (abstracte) klassen komen bijvoorbeeld handig van pas bij polymorfisme, zoals hierboven al aangegeven. Wanneer een programmeur een complete klassenstructuur (met afgeleide klassen en basisklassen dus)schrijft en hij wil dat elke afgeleide klasse bepaalde functies ondersteunt, dan verzekert hij dat dit gebeurt door een interface-klasse als basisklasse te maken. Stel: jij en je vrienden-slaven-programmeurs hebben de opdracht gekregen om alle soorten voertuigen onder te brengen in een klassenstructuur. Wel dan dan heb je verschillende onderverdelingen: watervoertuigen (met ondervedeling: jachten, jetski's, ...), wegvoertuigen (met onderverdelingen: vierwielers, tweewielers, éénwielers(?), ...), luchtvoertuigen (luchtballon, F16, bezemsteel, ...). Nu, jij staat het hoofd van het project en moet dus de basisklasse schrijven. Bovendien wil je er zeker van zijn dat je vrienden er voor zorgen dat elk voertuig dat zij toevoegen aan de klassenstructuur (dus afleiden van een 'hogere' klasse (bv. van de wegvoertuigen) kan bewegen (lees: dat het een functie move() bevat). Nu door zo'n interfaceklasse te definiëren en daarin aan te geven dat move() zeker tot de interface (snap je hem, "interface") moet behoren van je klassenstructuur, zit je goed en verplicht je dat je vrienden alleen voertuigen toevoegen die kunnen bewegen (en als ze het toch niet zouden doen, heb jij heel domme vrienden...). (btw: wat ik nu juist beschreef is geen polymorfisme, maar steunt wel op zo'n klassenstructuur, met al dan niet een interfaceklasse als basisklasse, google eens op polymorfisme)
@koen: heb je gelijk in, die worden worden ook op php.net gebruikt, maar voor de gemakkelijkheid noem ik een method meestal een functie omdat het woord "function" ervoor staat. en tja een propertie wordt ook geschreven gelijk een variabele.
Btw, zelf even een vraagje: ik las ooit ergens dat het onveilig is om bv $_SESSION te gebruiken in een method ( ) zelf, maar op deze wel door te geven, dus een voorbeeld:
// dit zou onveilig zijn
class test
{
public function username()
{
echo $_SESSION['username'];
}
}
$klasse = new test;
$klasse->username();
// en dit zou wel veilig zijn
class test
{
public function username( $var )
{
echo $var;
}
}
$klasse = new test;
$klasse->username( $_SESSION['username'] );
@Joost: afhankelijkheid in je klasse? Het zou simpel zijn om de sessionvar ter beschikking te stellen van de public user: sla de sessionvar op in een klassevar (public/private) en maak hem public via een getter.
Je hebt een methode gemaakt die een gebruikersnaam echoed. De ene keer wil je deze uit de sessie halen en een andere keer bijvoorbeeld uit een database of een xml bestand. Hier kan je beter voor zijn door de tweede keuze te gebruiken zodat je in de toekomst niet meer voor verassingen staat.