Eerste OOP script

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Henk PHP

Henk PHP

14/10/2008 12:47:00
Quote Anchor link
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!
Gewijzigd op 01/01/1970 01:00:00 door Henk PHP
 
PHP hulp

PHP hulp

02/03/2024 18:20:25
 
RvW Of toch niet

RvW Of toch niet

14/10/2008 13:45:00
Quote Anchor link
ik mis de view classe.
 
Henk PHP

Henk PHP

14/10/2008 13:48:00
Quote Anchor link
Is er een view class nodig dan? Ik haal gewoon de entries uit Guestbook class.
 

14/10/2008 13:55:00
Quote Anchor link
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 concept design pattern.
Gewijzigd op 01/01/1970 01:00:00 door
 
Henk PHP

Henk PHP

14/10/2008 14:15:00
Quote Anchor link
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?
 
Loran DP

Loran DP

14/10/2008 14:21:00
Quote Anchor link
miss leuk om in de script lib te zetten??
 
Henk PHP

Henk PHP

14/10/2008 18:22:00
Quote Anchor link
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
 
Leroy Boerefijn

Leroy Boerefijn

14/10/2008 18:32:00
Quote Anchor link
ik denk niet dat die Mysql klasse veel nut heeft ;)
 
Jurgen assaasas

Jurgen assaasas

14/10/2008 18:44:00
Quote Anchor link
MVC is een model, je hoeft je er niet aan te houden.
 
Arian Stolwijk

Arian Stolwijk

14/10/2008 18:45:00
Quote Anchor link
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
Gewijzigd op 01/01/1970 01:00:00 door Arian Stolwijk
 
Henk PHP

Henk PHP

14/10/2008 18:57:00
Quote Anchor link
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!
Gewijzigd op 01/01/1970 01:00:00 door Henk PHP
 
RvW Of toch niet

RvW Of toch niet

14/10/2008 19:14:00
Quote Anchor link
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
 
Arian Stolwijk

Arian Stolwijk

14/10/2008 19:33:00
Quote Anchor link
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 ;)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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']);
    }
}


?>
Gewijzigd op 01/01/1970 01:00:00 door Arian Stolwijk
 
Henk PHP

Henk PHP

14/10/2008 19:41:00
Quote Anchor link
Mijn dank is groot Arjan! Ik ben weer even zoet.

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!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.