OOP gastenboek
dit is wat ik heb tot nu.
class
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
class Gastenboek {
private $reacties;
private $bestand;
public function __construct($bestand) {
$this->bestand = $bestand;
}
public function reactie_toevoegen(Reactie $reactie) {
$fp = fopen($this->bestand, 'a');
fwrite($fp, $reactie->weergeven());
fclose($fp); }
public function weergeven() {
return '<div id="gastenboek">' . file_get_contents($this->bestand) . '</div>';
}
}
class Gebruiker {
private $naam;
private $email;
private $website;
public function __construct($naam, $email, $website) {
$this->naam = $naam;
$this->email = $email;
$this->website = $website;
}
public function reactie_plaatsen(Gastenboek $gastenboek, $reactie) {
$reactie = new Reactie($reactie, $this, date('d-m-Y'), date('h:i'));
$gastenboek->reactie_toevoegen($reactie);
}
public function weergeven() {
if($this->website != null)
return '<a href="' . $this->website . '" >' . $this->naam . '</a>';
else
return $this->naam;
}
}
class Reactie {
private $Gebruiker;
private $reactie;
private $datum;
private $tijd;
public function __construct($reactie, Gebruiker $gebruiker, $datum, $tijd) {
$this->reactie = $reactie;
$this->gebruiker = $gebruiker;
$this->datum = $datum;
$this->tijd = $tijd;
}
public function weergeven() {
return '<div class="reactie">
<span class="geplaatst">Geplaatst door: ' . $this->gebruiker->weergeven() . ' op
<strong>' . $this->datum . '</strong> om
<strong>' . $this->tijd . '</strong></span>
<p>' . $this->reactie . '</p></div><br />';
}
}
?>
class Gastenboek {
private $reacties;
private $bestand;
public function __construct($bestand) {
$this->bestand = $bestand;
}
public function reactie_toevoegen(Reactie $reactie) {
$fp = fopen($this->bestand, 'a');
fwrite($fp, $reactie->weergeven());
fclose($fp); }
public function weergeven() {
return '<div id="gastenboek">' . file_get_contents($this->bestand) . '</div>';
}
}
class Gebruiker {
private $naam;
private $email;
private $website;
public function __construct($naam, $email, $website) {
$this->naam = $naam;
$this->email = $email;
$this->website = $website;
}
public function reactie_plaatsen(Gastenboek $gastenboek, $reactie) {
$reactie = new Reactie($reactie, $this, date('d-m-Y'), date('h:i'));
$gastenboek->reactie_toevoegen($reactie);
}
public function weergeven() {
if($this->website != null)
return '<a href="' . $this->website . '" >' . $this->naam . '</a>';
else
return $this->naam;
}
}
class Reactie {
private $Gebruiker;
private $reactie;
private $datum;
private $tijd;
public function __construct($reactie, Gebruiker $gebruiker, $datum, $tijd) {
$this->reactie = $reactie;
$this->gebruiker = $gebruiker;
$this->datum = $datum;
$this->tijd = $tijd;
}
public function weergeven() {
return '<div class="reactie">
<span class="geplaatst">Geplaatst door: ' . $this->gebruiker->weergeven() . ' op
<strong>' . $this->datum . '</strong> om
<strong>' . $this->tijd . '</strong></span>
<p>' . $this->reactie . '</p></div><br />';
}
}
?>
en ik heb in mijn index.php dit gezet
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$gastenboek = new Gastenboek ('gastenboek.txt');
echo $gastenboek->weergeven();
$gastenboek = new Gastenboek ('gastenboek.txt');
$gebruiker = new Gebruiker($_POST['naam'], $_POST['email'], $_POST['website']);
$gebruiker->reactie_plaatsen($gastenboek, $_POST['reactie']);
?>
$gastenboek = new Gastenboek ('gastenboek.txt');
echo $gastenboek->weergeven();
$gastenboek = new Gastenboek ('gastenboek.txt');
$gebruiker = new Gebruiker($_POST['naam'], $_POST['email'], $_POST['website']);
$gebruiker->reactie_plaatsen($gastenboek, $_POST['reactie']);
?>
<form method="post">
<div>
<input type="text" id="naam" name="naam" placeholder="naam">
</div>
<div>
<input type="email" id="email" name="email" placeholder="email" requierd>
</div>
<div>
<input type="website" id="website" name="website" placeholder="website">
</div>
<div>
<input type="textarea" id="reactie" name="reactie" placeholder="reactie">
</div>
<div>
<input type="submit" value="plaats reactie">
</div>
</form>
?>
ik krijg de volgende problemen/foutmeldingen:
undefined *** over deze regels ( nu zou ik in flat php wel weten hoe dit op te lossen maar hoe zou ik dit nu aan pakken?)
Code (php)
1
2
3
4
2
3
4
<?php
$gebruiker = new Gebruiker($_POST['naam'], $_POST['email'], $_POST['website']);
$gebruiker->reactie_plaatsen($gastenboek, $_POST['reactie']);
?>
$gebruiker = new Gebruiker($_POST['naam'], $_POST['email'], $_POST['website']);
$gebruiker->reactie_plaatsen($gastenboek, $_POST['reactie']);
?>
verder elke keer als ik refresh dan zie ik
Geplaatst door: op 26-04-2012 om 10:51
verder niets..
en dan alleen het form ( wat ik niet weet hoe nu aan te sluiten op het php gedeelte )
kan iemand me een opstapje geven hoe nu verder?
Gewijzigd op 26/04/2012 23:09:16 door - Ariën -
Probeer scripten echt te begrijpen, probeer niet zomaar te denken 'ach dat legt iemand straks wel uit of dat hoef ik niet te weten'. Nee, OOP is nadenken. Het grootste verschil tussen flat PHP en OOP PHP is dat flat gewoon neer wordt gekwakt zonder enig denken erachter en dat je bij OOP eerst wel een uur nadenkt over hoe je iets goed maakt en dan pas gaat scripten.
Ik denk, zoals erwin al in een vorige topic van je aangaf, dat OOP nog wat te hoog gegrepen is. Probeer eerst normale PHP scripts goed te begrijpen en na te denken over normaal PHP en dan pas verder te gaan naar OOP.
in flat php zou ik zoals aar zegt $_SERVER['REQUEST_METHOD']=="POST" gebruiken.
maar hoe dit nou in OOP?
kan ik dit ook gewoon gebruiken of moet ik daar ook een ( form control class ) voor schrijven.
overigens snap ik ook niet hoe undefined errors op te lossen in OOP maar dat zou niets met de logica te maken moeten hebben toch? dat is gewoon weten hoe en klaar.. neem ik aan..
Toevoeging op 26/04/2012 23:21:19:
edit: een voorbeeld van wat ik nu allemaal heb
development.reshadfarid.nl
Gewijzigd op 26/04/2012 23:21:39 door Reshad F
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// saaie validatie (eventueel een FormValidate klasse)
$user = new User($_POST['from']);
$post = new Post($user, $_POST['title'], $_POST['description']);
$post->save();
}
?>
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// saaie validatie (eventueel een FormValidate klasse)
$user = new User($_POST['from']);
$post = new Post($user, $_POST['title'], $_POST['description']);
$post->save();
}
?>
hmm dit snap ik nu. toegepast en heb alle errors weg zoals het hoort ook! maar nu wil ik de input controleren.. wordt dit doorgaans in OOP gedaan of met flat php?
Het is een beetje hoe je zelf vind hoever je moet gaan. Je kan zover gaan als in talen als JAVA of C# waarbij je alleen nog maar MyApp::main() hoeft aan te roepen en dat dan alles gaat werken. Maar je kan het ook wat minder OO houden en ook wat flat erbij gooien.
Reshadd, niet vervelend bedoeld hoor, maar gezien je posts van de afgelopen dagen heb ik het idee dat je beter eerst wat basis PHP kennis kunt opdoen. Aan de hand van de vragen die je stelt krijg ik namelijk het idee dat het aan wat algemene PHP kennis ontbreekt. Ik denk dat je nu even iets teveel boven je niveau bezig bent. Ik denk dat je het zeker wel in je hebt, maar je moet eerst de basis wat beter onder de knie krijgen. Nogmaals, niet lullig bedoeld... ik probeer je alleen de juiste richting in te sturen.
@ozzie ik snap wat je bedoelt.. maar ik denk niet dat dat aan mijn kennis ligt maar aan mijn eigen verwachtingen. ik wil soms zoveel doen dat ik erover ga nadenken en alles in mijn hoofd ga stoppen met hoe en wat alles moet ( logica ) en dat ik daardoor een blackout krijg. dit heb ik overigens niet alleen met programmeren maar ook met gewoon een simpel rekentoetsje waardoor ik niet meer weet wat 2 + 2 was ( nee ik ben niet dyslectisch ) maar vandaar dat ik van mijn stagebegeleider ook zegt dat ik alle stappen op mijn todolist moet zetten en alles moet documenteren zodat als ik iets wil weten mezelf niets moet afvragen maar gewoon opzoeken in mijn documentatie. maar dit gaat ook niet altijd goed ik doe al ruim een jaar php ( daarvoor al meerdere talen gedaan zoals C#, visual basic, klein stukje java ) en op een of ander manier vind ik OOP makkelijker te begrijpen omdat ik die talen ken alleen weet ik niet tot hoever ik een link kan leggen met OOP php en FLAT php zo bijvoorbeeld met de REQUEST_METHOD ik dacht dat ik zelfs daarvoor een class moest gaan schrijven vandaar dat ik vroeg hoe nu verder. al met al denk ik wel dat ik het kan zolang ik alles maar documenteer vandaar dat ik nu met OOP PHP alles op mijn website zet met uitleg txt bestandje ernaast zodat ik alles kan opzoeken. hoop dat ik het zo goed uitgelegd heb :)
VANAF NU GELDT HET VOLGENDE VOOR JOU:
- Niks moet, ik (Reshadd) hoef echt helemaal niks en heb geen enkele verplichting.
- Om optimaal te presteren, moet ik niet alles tegelijk willen.
- Ik kan niet ineens van A naar Z en daarom doe ik alles STAPJE VOOR STAPJE.
- Als ik aan het programmeren ben, neem ik tussendoor regelmatig RUST.
Zo, laat over een weekje maar eens weten hoe het bevalt ;-)
hahah, je bent niet de eerste die het zegt;) maar bedankt voor de tips! het is inderdaad tijd voor beetje rust dus macbook gaat uit en tv gaat aan! even niet meer programmeren en morgen weer verder :P
Heel goed. Leer mijn tips uit je hoofd, want ik denk dat jij er veel profijt uit zal halen. Veel succes, en... relax ;-)
Of probeer eens Xcode. Je kunt leuke apps maken voor de iPhone e.d. met Objective-C, hoewel het wel een lastige taal is, heel verschillend van talen als PHP, Java, etc.
heb je getest of er een php / html invoer beveiliging is zodat ik geen
kan posten en de hele website kan overnemen?
Groet ,
Olivier
Sorry ben hier nog niet lang maar Reshad...... Je legt mooi uit wat je allemaal doet. UML zegt je dan ook wel wat? Vaak wordt dit namelijk als basis gebruikt. M.a.w. Als je object georienteerd wil gaan programmeren dan is een goed plan wel echt nodig, anders is het echt zinloos en kun je het beter bij scripten houden.
De object-oriëntatie is prima. Je lijkt te snappen hoe er een een relatie kan zijn tussen objecten en hoe dat te gebruiken.
De opslag van je code zit nu alleen iets te diep geïntegreerd met de rest. Probeer eens een gastenboek te maken dat niets met opslag te maken heeft. Denk aan een gastenboek als een 'houder' van berichten. Sla dus gewoon de berichten op in een array. De weergeef functie moet dan itereren (langs elk item gaan) met een foreach loop en dan bij elk bericht de weergeef() functie daarvan aanroepen.
Daarna kan je een opslagmechanisme toevoegen. Het opslaan van de gerenderde, 'weergegeven', HTML is onhandig, omdat het lastig is daar weer die array van berichten te maken. Veel verstandiger is het om het in een database of XML bestand op te slaan. Dan sla je niet de render op, maar alleen de echte informatie (naam, email, etc.). Je kan dan de volgende functies toevoegen:
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
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
<?php
class Gastenboek
{
protected $berichten = array();
public function opslaan($bestand)
{
// Bouw de basis
foreach($this->berichten as $bericht) {
// Maak XML van het bericht en voeg deze aan de basis toe
}
// Sla het XML bestand op
}
public static function laad($bestand)
{
// Lees de XML uit
$gastenboek = new Gastenboek();
foreach($berichten as $berichtData) {
$bericht = new Bericht($berichtData['naam'], $berichtData['email'], enz...);
}
return $gastenboek;
}
}
// Dan
$gastenboek = Gastenboek::laad('data.xml');
$gastenboek->weergeven();
?>
class Gastenboek
{
protected $berichten = array();
public function opslaan($bestand)
{
// Bouw de basis
foreach($this->berichten as $bericht) {
// Maak XML van het bericht en voeg deze aan de basis toe
}
// Sla het XML bestand op
}
public static function laad($bestand)
{
// Lees de XML uit
$gastenboek = new Gastenboek();
foreach($berichten as $berichtData) {
$bericht = new Bericht($berichtData['naam'], $berichtData['email'], enz...);
}
return $gastenboek;
}
}
// Dan
$gastenboek = Gastenboek::laad('data.xml');
$gastenboek->weergeven();
?>
Die laatste methode kan je een 'static factory method' noemen, maar daar om je later nog wel achter. Het is gewoon een statische functie die voor je het object opbouwt.