Eerste OOP script
He!
Ik me gister even een beetje in OOP bediept en uiteindelijk mijn eerste gastenboek in elkaar geknutselt.
Hij werkt, dat is al een positief punt, ik wil hem alleen graag even hier laten zien zodat de meer ervaren OOP mensen er wat commentaar op kunnen geven aangezien ik zelf nogal weinig ervaring heb met OOP.
Ik heb twee classes:
een mysql class, voor de connectie, selectie en query e.d
en de guestbook class, voor het gastenbook (who would have guessed)
Klik hier voor de mysql class
Klik hier voor de guestbook class
Verder heb ik nog:
index.php
new_entry.php
Zo dat zijn eigenlijk alle bestanden.
Een werkend voorbeeld is hier te zien
Ik hoop dat jullie me kunnen vertellen wat ik goed doe, maar vooral wat ik fout doe - en waarom - zodat ik het allemaal beter kan begrijpen.
Thanks!
Ik me gister even een beetje in OOP bediept en uiteindelijk mijn eerste gastenboek in elkaar geknutselt.
Hij werkt, dat is al een positief punt, ik wil hem alleen graag even hier laten zien zodat de meer ervaren OOP mensen er wat commentaar op kunnen geven aangezien ik zelf nogal weinig ervaring heb met OOP.
Ik heb twee classes:
een mysql class, voor de connectie, selectie en query e.d
en de guestbook class, voor het gastenbook (who would have guessed)
Klik hier voor de mysql class
Klik hier voor de guestbook class
Verder heb ik nog:
index.php
new_entry.php
Zo dat zijn eigenlijk alle bestanden.
Een werkend voorbeeld is hier te zien
Ik hoop dat jullie me kunnen vertellen wat ik goed doe, maar vooral wat ik fout doe - en waarom - zodat ik het allemaal beter kan begrijpen.
Thanks!
Gewijzigd op 01/01/1970 01:00:00 door Henk PHP
ik mis de view classe.
Is er een view class nodig dan? Ik haal gewoon de entries uit Guestbook class.
'Henk:
Is er een view class nodig dan? Ik haal gewoon de entries uit Guestbook class.
Dat hoort tot het MVC
Het MVC model is me onbekend eerlijk gezegd.
Heb ik nou zonder dat ik het weet de model en de controller gemaakt?
Is de mysql class de model en de guestbook class de controller?
Heb ik nou zonder dat ik het weet de model en de controller gemaakt?
Is de mysql class de model en de guestbook class de controller?
miss leuk om in de script lib te zetten??
ik had graag wat op- of aanmerkingen op de classes. Dit is de eerste keer dat ik zoiets doe dus ik zou graag wat feedback op die twee classes hebben.
Over dat MVC model, dat moet ik ook maar een keertje uitproberen :P
Over dat MVC model, dat moet ik ook maar een keertje uitproberen :P
ik denk niet dat die Mysql klasse veel nut heeft ;)
MVC is een model, je hoeft je er niet aan te houden.
Gooi de mysql class weg. Het is slechts een simpele wrapper van de mysql extensie van php. Gebruik gewoon de OOP methode van de mysqli of de PDO extensie. Deze class beperkt je alleen maar in je mogelijkheden.
Ik zou je properties (variabelen) van je Gastenboek class protected maken ipv private. Zo kan je later de Gasteboek class nog een keer extenden om extra mogelijkheden toe te voegen.
Bij get_pages() zou je bijvoorbeeld wel eerst kunnen controleren of $this->pages werkelijk is geset. Zo niet kan je eerst set_pages() aanroepen.
Je zou het bijvoorbeeld zou kunnen maken dat je set_pages niet in je constructor aanroept, maar bij de eerste keer dat je get_pages() aanroept. Stel nou dat nooit get_pages() wordt aangeroepen, wordt dus ook niet een extra query uitgevoerd.
set_pages() vind ik trouwens wel niet perfect gekozen. Bij een 'set' method verwacht je dat je een parameter kunt meegeven om een bepaalde property van je class een bepaalde waarde mee te geven. fetch_page_count() zou ik handiger vinden.
Je zou van $this->entriesPerPage; een public property kunnen maken zodat je later het aantal entries per pagina kunt aanpassen. Het zou nog mooier zijn als je die property protected houdt, en hem met een set method kunt setten.
Verder is het een leuk script! Het is natuurlijk nog niet écht OOP omdat je nog weinig met objecten werkt. Dan zou je van elke entry bijvoorbeeld een apart object (class) kunnen maken. met bijvoorbeeld de methods getAuthor(), getLength(), setMessage() die het bericht met een mysql query aanpast, etc.
@ rvw: MVC is meestal OOP, maar OOP != MVC
Ik zou je properties (variabelen) van je Gastenboek class protected maken ipv private. Zo kan je later de Gasteboek class nog een keer extenden om extra mogelijkheden toe te voegen.
Bij get_pages() zou je bijvoorbeeld wel eerst kunnen controleren of $this->pages werkelijk is geset. Zo niet kan je eerst set_pages() aanroepen.
Je zou het bijvoorbeeld zou kunnen maken dat je set_pages niet in je constructor aanroept, maar bij de eerste keer dat je get_pages() aanroept. Stel nou dat nooit get_pages() wordt aangeroepen, wordt dus ook niet een extra query uitgevoerd.
set_pages() vind ik trouwens wel niet perfect gekozen. Bij een 'set' method verwacht je dat je een parameter kunt meegeven om een bepaalde property van je class een bepaalde waarde mee te geven. fetch_page_count() zou ik handiger vinden.
Je zou van $this->entriesPerPage; een public property kunnen maken zodat je later het aantal entries per pagina kunt aanpassen. Het zou nog mooier zijn als je die property protected houdt, en hem met een set method kunt setten.
Verder is het een leuk script! Het is natuurlijk nog niet écht OOP omdat je nog weinig met objecten werkt. Dan zou je van elke entry bijvoorbeeld een apart object (class) kunnen maken. met bijvoorbeeld de methods getAuthor(), getLength(), setMessage() die het bericht met een mysql query aanpast, etc.
@ rvw: MVC is meestal OOP, maar OOP != MVC
Gewijzigd op 01/01/1970 01:00:00 door Arian Stolwijk
Oke! Thanks Arjan, op dat soort posts zit ik te wachten!
Ik denk dus dat die mysql class de deur uit gaat. Dan maar met PDO aan de gang.
Wat je zegt over get_pages(), set_pages() en $entriesPerPage klopt wel, en die dingetjes kan ik ook makkelijk aanpassen.
Even over dat extenden: ik welke situatie kan ik het beste een nieuwe class aanmaken (dus guestbook extenden) en in welke situatie kan ik het beste gewoon een paar methods toevoegen aan de guestbook class?
En over een object per entry, hoe kan ik dat het beste doen?
Ik ga even aan de gang met je tips, hartstikke bedankt!
Ik denk dus dat die mysql class de deur uit gaat. Dan maar met PDO aan de gang.
Wat je zegt over get_pages(), set_pages() en $entriesPerPage klopt wel, en die dingetjes kan ik ook makkelijk aanpassen.
Even over dat extenden: ik welke situatie kan ik het beste een nieuwe class aanmaken (dus guestbook extenden) en in welke situatie kan ik het beste gewoon een paar methods toevoegen aan de guestbook class?
En over een object per entry, hoe kan ik dat het beste doen?
Ik ga even aan de gang met je tips, hartstikke bedankt!
Gewijzigd op 01/01/1970 01:00:00 door Henk PHP
'Arian:
Gooi de mysql class weg. Het is slechts een simpele wrapper van de mysql extensie van php. Gebruik gewoon de OOP methode van de mysqli of de PDO extensie. Deze class beperkt je alleen maar in je mogelijkheden.
heb zelf ook en mysql classe maar die extended en de classe PDO,
ik zou je mysql classe niet weg gooien maar bewerken en aanpassen.
en goed voorbeeld = KLIK
'Arian:
@ rvw: MVC is meestal OOP, maar OOP != MVC
mjah ok, daar in heb je gelijk.
Gewijzigd op 01/01/1970 01:00:00 door RvW Of toch niet
Even een 'klein' code voorbeeltje:
Het zal vast niet direct werken, maar het gaat even om het idee ;)
Ook kan je je afvragen wat bij een gastenboek het nut is om van een entry een object te maken. Maar het gaat dus even om het principe ;)
Het zal vast niet direct werken, maar het gaat even om het idee ;)
Ook kan je je afvragen wat bij een gastenboek het nut is om van een entry een object te maken. Maar het gaat dus even om het principe ;)
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
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
<?php
class Gastenboek {
public function get_entries(){
$limit = $this->currentPage * $this->entriesPerPage - $this->entriesPerPage;
$sql = "SELECT id, message, user_name FROM entries LIMIT " . $this->entriesPerPage . " OFFSET " . $limit;
$this->db->query($sql);
$entries = array();
foreach($this->db->get_assoc() as $entry){
$entries[$entry['id']] = new Gastenboek_Entry($entry['id'],$entry);
}
$this->entries = $entries;
return $entries;
}
}
class Mijn_Gastenboek extends Gastenboek {
public function getEntry($id){
return isset($this->entries[$id]) ? $this->entries[$id] : false;
}
public function createEntry($options){
$this->db->insert('gastenboek',$options);
$id = $this->db->lastInsertId();
$this->entries[$id] = new Gastenboek_Entry($id,$options);
}
}
class Gastenboek_Entry {
protected $options;
protected $id;
public function __construct($id,$options){
$this->setOptions($options);
}
protected function setOptions($options){
$this->options['author'] = isset($options['author']) ? $options['author'] : '';
// ...
}
public function getAuthor(){
if(!isset($this->options['author'])){
return false;
}
return $this->options['author'];
}
public function setMessage($msg){
$this->db->update('gastenboek',array('message'=>$this->db->escape($msg)),'id = '.(int)$id);
}
// ...
}
$gastenboek = new Mijn_Gastenboek();
$entry = $gastenboek->getEntry(3);
if($entry !== false){
echo $entry->getAuthor();
if(!empty($_POST['msg'])){
$entry->setMessage($_POST['msg']);
}
}
?>
class Gastenboek {
public function get_entries(){
$limit = $this->currentPage * $this->entriesPerPage - $this->entriesPerPage;
$sql = "SELECT id, message, user_name FROM entries LIMIT " . $this->entriesPerPage . " OFFSET " . $limit;
$this->db->query($sql);
$entries = array();
foreach($this->db->get_assoc() as $entry){
$entries[$entry['id']] = new Gastenboek_Entry($entry['id'],$entry);
}
$this->entries = $entries;
return $entries;
}
}
class Mijn_Gastenboek extends Gastenboek {
public function getEntry($id){
return isset($this->entries[$id]) ? $this->entries[$id] : false;
}
public function createEntry($options){
$this->db->insert('gastenboek',$options);
$id = $this->db->lastInsertId();
$this->entries[$id] = new Gastenboek_Entry($id,$options);
}
}
class Gastenboek_Entry {
protected $options;
protected $id;
public function __construct($id,$options){
$this->setOptions($options);
}
protected function setOptions($options){
$this->options['author'] = isset($options['author']) ? $options['author'] : '';
// ...
}
public function getAuthor(){
if(!isset($this->options['author'])){
return false;
}
return $this->options['author'];
}
public function setMessage($msg){
$this->db->update('gastenboek',array('message'=>$this->db->escape($msg)),'id = '.(int)$id);
}
// ...
}
$gastenboek = new Mijn_Gastenboek();
$entry = $gastenboek->getEntry(3);
if($entry !== false){
echo $entry->getAuthor();
if(!empty($_POST['msg'])){
$entry->setMessage($_POST['msg']);
}
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Arian Stolwijk
Mijn dank is groot Arjan! Ik ben weer even zoet.
Haha, you brought it up!
'Arian:
Ook kan je je afvragen wat bij een gastenboek het nut is om van een entry een object te maken. Maar het gaat dus even om het principe ;)
Haha, you brought it up!




