Eerste OOP script
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 schreef op 14.10.2008 13:48:
Is er een view class nodig dan? Ik haal gewoon de entries uit Guestbook class.
Dat hoort tot het MVC
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??
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.
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
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 schreef op 14.10.2008 18:45:
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 schreef op 14.10.2008 18:45:
@ 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
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
Arian schreef op 14.10.2008 19:33:
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!