Ik programmeer nu toch al een tijdje, en heb al veel de tip gekregen om eens te beginnen met OOP. Ik had er wat over gelezen op internet en het leek mij allemaal iets te moeilijk. Ik heb mezelf nu toch eens kunnen overhalen om eens een scriptje in classes te schrijven.
Ik heb dus een mini-telefoonboekje geschreven en natuurlijk had ik graag tips gehad. Ik ken dus zo goed als niks van OOP, dus graag tips en opmerkingen.
Als je OO gaat programeren is het de bedoeling dat je zoveel mogelijk gescheiden houd,
bij het voorbeeld zou ik zelf kiezen voor de volgend 2 klasses
- Telefoonboek
( Deze heeft een Array met objecten van Personen )
- Persoon
( Hierin worden alle gegevens opgeslagen van de persoon )
- Nooit echoen in je klasses, maak gebruik van return en return een string die je vervolgens in je pagina pas echoed.
- VOor het weergeven van fouten kan je Exceptions gebruiken.
- Maak gebruik van PDO ( Goed artikel: http://www.phphulp.nl/php/tutorials/8/534/ )
- Classnamen altijd met hoofdletter beginnen
- Namen van methodes met kleine letter beginnen
Mijn tip: denk niet in functies, dingen die het moet doen, maar denk in objecten (dôh!), dingen die je hebt.
Wat heb je?
- Telefoonboek
- Vermeldingen in het telefoonboek. (Een vermelding zou ook los van het telefoonboek kunnen voorkomen, bijvoorbeeld in de vorm van een visitekaartje, dus daarom is deze niet een met het telefoonboek.)
Wat heeft je telefoonboek voor eigenschappen?
(de public properties)
- geen :(
Wat kan je telefoonboek?
(de public methods)
- vermeldingen ophalen
- vermeldingen toevoegen
Wat heeft je telefoonboek daarvoor nodig?
(de protected properties & methods)
- een database-verbinding.
Wat heeft je vermelding voor eigenschappen?
- een id, uniek nummer, auto-increment kolom bijvoorbeeld.
- naam
- nummer
Wat kan je vermelding
- niet echt iets. Misschien dat je een functie kan verzinnen waarmee hij wordt weergegeven in de vorm van een [google]hCard[/google], al is het de vraag of je die mix van presentatie & data wilt maken.
Wat heeft je vermelding daarvoor nodig?
- niets
Dus om het even samen te vatten:
Je hebt nodig: Een database-link (ik zou gewoon lekker gemakkelijk voor PDO gaan), een Telefoonboek-klasse en een Vermelding-klasse. De telefoonboek-klasse geef je een PDO-instantie mee in de constructor, en heeft methods om vermeldingen uit de database te halen, op te slaan en te verwijderen. De ophaal-methods geven een array met instanties van Vermelding terug, de save & delete methods accepteren een instantie van Vermelding (je hoeft de instantie van Vermelding niet eens helemaal te vullen, zo lang hij maar het id van de database-regel heeft zodat het telefoonboek weet welke hij moet verwijderen.)
Ok om te beginnen met de eerste classe. Bij je Select_db methode als er geen db wordt mee gegeven moet je een exception throwen:
<?php
throw new Exception ( 'Invalid database specified for selection' );
?>
In een class moet je ( vrijwel ) nooit echoen. Met een exception kun je nu een error opvangen op een lager niveau en dan kan je er wat aan doen:
<?php
try {
$db = new mysql(..);
} catch ( Exception $e ) {
$db = new mysql(andere gegevens);
// of miss wil je wel een error op het scherm printen, dat is niet aan het object zelf om dat af te handelen.
}
?>
Veder is het misschien slim om ook een optionele parameter aan je constructor mee te geven voor de te selecten database.
Over het algemeen is het ook makkelijk om je open connectie bij te houden:
<?php
protected $connection;
// en dan in je constructor:
$connection = mysql_connect (...);
?>
Dan kan je bijvoorbeeld in je destructor weer de connectie sluiten.
@Jelmer
Op de site waar ik het een en ander over OOP te weten probeerde te komen vond ik een voorbeeldje van een OO gastenboek. Dit bestond ook maar uit 1 class..
De telefoonboek-class versta ik, het bevat zowat wat ik in mijn class had. Maar de vermelding class snap ik niet echt.. In de telefoonboek class doe je toch al alles wat nodig is? En die functies, ik moet dus denken met wat ik heb? Maar wanneer mag ik dan bijvoorbeeld maar het form echoën? En hoort dat in de class te gebeuren of met een instancevan de class?
Blijkbaar was het voorbeeld die ik bekeek niet zo goed geschreven als ik het zo bekijk.. Heb je misschien een voorbeeld van een gelijkaardig script die dan wel goed geschreven is? Dan kan ik dat eens goed bestuderen en uit leren.
De truc met Object orientated programmeren is dat je niet meer gaat denken in simpele typen zoals strings en nummertjes, en arrays, maar in objecten en collecties. -- maar dat met die collecties in plaats van arrays kan je in het begin nog wel even achterwege laten.
Een gastenboek in 1 klasse is niet werkelijk OO geprogrammeerd. Dat is gewoon het ontwerp opdelen in functies, en die achter elkaar aanroepen.
De klasse Vermelding is nu nog niet erg nuttig, maar met oog op de toekomst heb je nu een plek waar je later functies aan toe kan voegen, bijvoorbeeld voor het opvragen van bijvoorbeeld het netnummer. Dan maak je een method in je Vermelding-klasse erbij die dat deel van het telefoonnummer teruggeeft en de rest van de code hoef je niet te veranderen. Stel dat je nu je database een beetje anders inricht, en ook het landnummer in het telefoonnummer gaat opnemen. Dan kan je de methods van Vermelding die het telefoonnummer en het netnummer aanpassen zodat ze het landnummer niet ook meegeven, en je kan er een nieuwe method bij maken. De rest van je code hoeft dan niet te veranderen, omdat die slechts afhankelijk is van de buitenkant, de API van de klasse Vermelding en niet verbonden is met de werking binnenin. Dat is een van de gevolgen van OOP. Je geeft de objecten hun verantwoordelijkheden, waardoor die logica die daarvoor nodig is maar op 1 plek in de code staat gedefinieerd. Er is maar 1 plek waar die fout kan gaan, en er is maar 1 plek waar je de code hoeft te veranderen wanneer je de werking wat wilt aanpassen. Zoek maar eens op abstractie.
Een formulier echo'en e.d, oftewel presentatie zou ikzelf nooit in klassen doen, maar in aparte php-bestanden die ik al dan niet include. Je kan er ook templates voor gebruiken mocht je dat leuk vinden, al heeft het weinig toegevoegde waarde. Door de presentatie buiten de klassen te houden kan je de klassen voor veel meer doeleinden gebruiken. Daarnaast is het gewoon prettig om PHP logica & HTML zo weinig mogelijk te mixen, niet mixen is overzichtelijker. Het afhandelen van je formulier, en de eigenschappen van het object veranderen op basis van de $_POST-argumenten doe je gewoon op de manier zoals je dat altijd hebt gedaan, buiten een klasse. Eventueel maak je er later een controller-klasse van conform met het MVC design pattern. Dan kan je ook die logica hergebruiken mocht dat nodig zijn.
Nu vind ik het stom dat ik een tutorial gelezen heb waar het voorbeeld 'slecht' was :p
Ik ben nu weer opnieuw aan het proberen, maar het lijkt nu wel of ik gewoon een verzameling functies maak, niets meer. Ik begrijp het OOP gedoe natuurlijk nog niet echt.. Maar heb je misschien een voorbeeld van een scriptje die volgens jou wél goed geschreven is? Dan kan ik mij daar op baseren en kijken hoe alles in elkaar zit. Ik heb hier nu wel een OO webshop liggen maar deze is gewoon té uitgebreid om als beginner er even tussenin te kruipen en alles proberen te begrijpen.
Nu zit ik namelijk weer zo vast als iets. Een goed voorbeeld zou zeker aangenaam zijn ;)
Beetje vreemd. Voor ieder telefoonnummer maak je een nieuw telefoonboek aan, en fetch je opnieuw alle data. Een telefoonnummer is toch niet een eigenschap van een telefoonboek? Een kaft is, maar een telefoonnummer hoort thuis in een klasse vermelding. Daarom zei ik dat je die los moest trekken.
Toen ik eraan bezig was, begon ik het ook raar te vinden. Begin het mss al een klein beetje te snappen, weetniet :P
Ik moet nu in feite nog een onderscheid maken welk functies in de boekklasse moet en welke in vermeldingklasse..
Ik moet dus in die loop vermeldinginstanties maken denk ik. Welke functies heb ik nodig in telefoonboek en welke in vermelding? Naar mijn mening kan add_record(); in beide? :S
Ik ga morgen even je voorbeeld goed bestuderen en dan nog s een poging wagen.