OOP beginners opdracht
Ik heb een paar tuts gevolgd en ik wil nu gewoon wat spelen er mee.
Maar wat is een leuke en leerzame opdracht om uit te voeren?
Iemand een goed en leuk idee?
Maak een formulier met waneer de gebruiker op submit drukt , zijn of haar naam verschijnt
Jordi kroon op 11/03/2011 00:09:51:
Maak een formulier met waneer de gebruiker op submit drukt , zijn of haar naam verschijnt
Slecht voorbeeld. Dat geeft de kracht van OOP niet weer. Ik ga er vanuit dat je al iets gevorderd bent wanneer je aan OOP start. Dus je hebt wellicht al eens een authenticatie systeem gemaakt. Probeer het nu eens in OOP en post het hier. Je kan heel simpel beginnen. Door gewoon bijvoorbeeld de gebruiker laten te inloggen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
// nieuwe class gebruiker
class gebruiker{
// public, want iedere gebruiker heeft dat
public $naam;
// funtie setnaam
public function setNaam($name) {
// $naam defineren
$this->naam = $name;
}
//functie getnaam
public function getNaam() {
// $this->naam terug geven
return $this->naam;
}
}
// kijken over een POST request is.
if($_SERVER['REQUEST_METHOD'] == "POST"){
//zo ja..
// Class gebruiker maken
$user = new gebruiker();
//$naam defineren door setNaam
$user->setNaam($_POST['naam']);
// uit lezen wat hier boven gedefineerd is.
echo $user->getNaam();
}
//Formulier
echo '<form method="post">
<input type="text" name="naam" value="'.$_POST['naam'].'"> <input type="submit" value="Verstuur naam">
</form>';
?>
// nieuwe class gebruiker
class gebruiker{
// public, want iedere gebruiker heeft dat
public $naam;
// funtie setnaam
public function setNaam($name) {
// $naam defineren
$this->naam = $name;
}
//functie getnaam
public function getNaam() {
// $this->naam terug geven
return $this->naam;
}
}
// kijken over een POST request is.
if($_SERVER['REQUEST_METHOD'] == "POST"){
//zo ja..
// Class gebruiker maken
$user = new gebruiker();
//$naam defineren door setNaam
$user->setNaam($_POST['naam']);
// uit lezen wat hier boven gedefineerd is.
echo $user->getNaam();
}
//Formulier
echo '<form method="post">
<input type="text" name="naam" value="'.$_POST['naam'].'"> <input type="submit" value="Verstuur naam">
</form>';
?>
Maar dan vraag ik mij af, waarom zoveel tekst als ik met $_POST['naam'] het zelfde resultaat geeft.
dat zit op een of andere manier mij zo tegen :P
Daarom vind ik dit heel lastig om op te pakken en tuts te volgen.
maar ik moet even door zetten..
Wat ik van de Public, en private begrijp:
Public.
Public is wat naar buiten worden gebracht
Private.
Private is wat binnen de class wordt gebruikt, BV tellen
en $this->iets is een waarde, ik niet niet precies wat het meer is dan $iets...
wat kan ik nog meer doen..
Het eerste wat me opval is "class gebruiker". Op zich niets mis mee, maar er zijn enkele gangbare afspraken i.v.m. naamgeving. Blache (moderator op dit forum) heeft dat duidelijk verwoord: http://phptuts.nl/view/45/6/
Verder is je redenering van public fout. Public betekent dat je in staat bent buiten de class die property kan aanspreken. Private betekent dat je dit enkel in de class zelf kan. Protected betekent dat een "afgeleide" class de property kan gebruiken maar buiten de class kan je het niet gebruiken.
In dit geval zou private beter zijn. Ik zie niet in waarom je de naam van een gebruiker buiten de class dient te benaderen.
De functie setname kan ik mee leven. Er zijn hier mensen die je zouden verwijzen naar __set, maar daar ben ik persoonlijk geen voorstander van. Wat je echter in dit geval wel kon doen, is gebruik maken van de costructor.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
/* let op: dit moet in je class */
__construct($sNaam) {
$this->_sNaam = $sNaam;
}
/* Procedurele code */
$oGebruiker = new Gebruiker('Mitchel');
?>
/* let op: dit moet in je class */
__construct($sNaam) {
$this->_sNaam = $sNaam;
}
/* Procedurele code */
$oGebruiker = new Gebruiker('Mitchel');
?>
Voor de get zou je __get kunnen gebruiken. Maar ook daar is mijn standpunt hetzelfde als bij __set.
(get en set kan je wel gebruiken om het on-the-fly gedrag van PHP tegen te gaan)
Dat betreft de kritiek op het script.
Toegegeven, het is niet gemakkelijk om een goed voorbeeld te geven. Ik ga even proberen uit te leggen waar voor mij persoonlijk de grootste kracht van OOP is.
Stel dat je een class hebt die zorgt voor de gebruikers. Een andere class zorgt voor een bericht te plaatsen (op een forum / op een blog / ...).
$iUserPermission = $oUser->getUserPermission();
$oMessage->create($sMessage, $ $iUserPermission);
In de message-class, ga je kijken of de gebruiken bepaalde rechten heeft. Hoe je aan die rechten komt, maakt voor de message-class niets uit. Dat is een zorg voor de user-class. Omgekeerd geldt dat ook: hoe een bericht gemaakt wordt maakt voor de user-class niet uit. Nu stel, vandaag maak ik een systeem dat gebruikers opslaat in een txt-bestand. Ik lees dat uit en ik haal de permissies op van een bepaalde gebruiker. Die geef ik dan mee aan de message-class. De message class controleer of die permissies voldoende zijn.
Nou, morgen realiseer ik mij eigenlijk dat gebruikers in een txt-bestand opslaan misschien toch niet zo'n goed idee was van mij. Daarom besluit ik ze in een database-class op te slaan. Ik pas dus de user-class aan. De message-class die blijft hetzelfde.
Dit geeft niet de volledige kracht weer van OOP, maar toch al een heleboel. Met dit voorbeeld wil ik aantonen dat je op een eenvoudige manier aanpassingen aan je (iets grotere) applicatie kan doen, zonder dat je de hele werking dient aan te passen. Verder, als je het wat breder bekijkt, zie je ook dat ik de user-class gemakkelijk voor andere projecten kan gaan hergebruiken. Iets wat met procedurele code vaak lastiger is.
De andere sterktes van OOP kan ik jou moeilijk uitleggen. Die ga je wellicht pas zien eens je het idee echt door hebt. En dat idee, dat kunnen wij je proberen uit te leggen, maar als je het niet ziet, dan zie je het niet.
Waarom zou je de hongaarse notatie propageren in een loosly typed taal als PHP?
Pim - op 11/03/2011 09:27:58:
Waarom zou je de hongaarse notatie propageren in een loosly typed taal als PHP?
Iedereen heeft wellicht zijn persoonlijke mening hierover. De mijne is: duidelijkheid. Wanneer ik een $_sName of $this->_sName gebruik, kan ik zonder enig zoekwerk al wat nuttigs vertellen. Ik weet door de underscore dat ik de property ofwel private ofwel protected heb gezet. Ik weet eveneens door de "s" dat het hier om een string gaat.
Ik ben er mij van bewust, als je een script vandaag schrijft dat het geen meerwaarde heeft. Je weet in de meeste gevallen wel nog vanbuiten wat wat is. Maar herneem hetzelfde script binnen 1 maand nog is, zal al wat lastiger zijn.
Wat betreft loosly-typed, helemaal mee akkoord. In OOP vind ik dit persoonlijk soms ongewenst. Ik vind dat het niet mag dat je zomaar on-the-fly een property kan gebruiken. Ik los dit op via setter en getter. Wanneer dan iets wordt aangeroepen, toon ik een error dat ik stout ben. (dus om mezelf te het loosley typed gedrag tegen te gaan)
Mitchel V op 11/03/2011 00:38:13:
maar ik moet even door zetten..
Wat ik van de Public, en private begrijp:
Public.
Public is wat naar buiten worden gebracht
Private.
Private is wat binnen de class wordt gebruikt, BV tellen
Wat ik van de Public, en private begrijp:
Public.
Public is wat naar buiten worden gebracht
Private.
Private is wat binnen de class wordt gebruikt, BV tellen
Een tijdje geleden heb ik op dit forum een uitgebreide uitleg gegeven over public, private en protected: http://www.phphulp.nl/php/forum/topic/oop-visibility/76673/
En een goed script om te beginnen is een gastenboek. Zorg dat een bericht kan worden geplaatst en alle berichten kunnen worden getoond.
Mitchel V op 11/03/2011 00:38:13:
Maar dan vraag ik mij af, waarom zoveel tekst als ik met $_POST['naam'] het zelfde resultaat geeft.
dat zit op een of andere manier mij zo tegen :P
Daarom vind ik dit heel lastig om op te pakken en tuts te volgen.
dat zit op een of andere manier mij zo tegen :P
Daarom vind ik dit heel lastig om op te pakken en tuts te volgen.
Het tonen van een naam is inderdaad een beetje en onhandig voorbeeld. Want dat kun je veel sneller doen. Maar met bijv. een gastenboek zou je het zo kunnen maken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$wouter = new User('Wouter J');
$pim = new User('Pim -');
$post = new Post();
$post->add('Wat een leuk gastenboek!', $pim->getName());
$post->add('Wat een leuk bericht!', $wouter->getName());
$gastenboek = new Book($post->getPosts());
echo $gastenboek->getContent();
?>
$wouter = new User('Wouter J');
$pim = new User('Pim -');
$post = new Post();
$post->add('Wat een leuk gastenboek!', $pim->getName());
$post->add('Wat een leuk bericht!', $wouter->getName());
$gastenboek = new Book($post->getPosts());
echo $gastenboek->getContent();
?>
(zoals Wouter hierboven, User is uniek per user, maar Post is niet uniek per post? Je voegt twee berichten toe aan één Post? Hoezo voeg je berichten toe aan een Post? Je stopt toch juist Posts in een Book? Waarom van User een apart object maken als je alleen maar de naam wilt onthouden? Waarom maakt Book je gastenboek-html, dat zou ik liever in iets aparts hebben zodat ik dat los van Book kan aanpassen en verwisselen.)
Hij voegt geen twee berichten aan 1 post toe. Per keer hij een add(paramters) aanroept, schrijft het het bericht weg naar de database. Al ben ik wel akkoord dat de bovenstaande code niet echt realistisch is. Normaal gezien, ga je 1 gebruiker en 1 bericht tegelijk behandelen bij een gastenboek. Verder sluit ik er me bij aan dat de werking van Book niet echt correct is. Het lijkt er nu op dat de class Book ook moet instaan voor de verwerking van berichten. Dat kan niet de bedoeling zijn. Book zou gewoon de weergave van het gastenboek moeten voorzien. (met bv. een aantal functies als setMessagesPerPage(int), orderMessages(ASC, [DATE]), selectMessages(5), ...)
Gewijzigd op 11/03/2011 10:46:32 door Write Down
Ik had zelf ook een gastenboek in een eerder topic geïmplementeerd, puur met als opzet OOP, maar wel KISS.
edit: en dan vergeet ik de link, pfff… http://phphulp.ikhoefgeen.nl/gastenboek.phps
Gewijzigd op 11/03/2011 11:28:13 door Jelmer -
dit topic
Jelmer heeft over het gastenboek uitgelegd in Als je het inderdaad enkel en alleen voor een gastenboek gaat gebruiken, kan je zeggen dat de link tussen beide mag aanwezig zijn. Toch vind ik het niet onverstandig om de classes ieder hun eigen functie te geven. Neem bijvoorbeeld dat je op je site een nieuwsysteem hebt. Dan zou je de message class ook daarvoor kunnen gebruiken.