Begin met OOP webshop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Roeltje M

Roeltje M

29/07/2013 18:47:23
Quote Anchor link
Hey Allemaal!

Ik zit al een poos in de PHP wereld, maar wat minder lang in de OOP wereld. Ik heb hier een aantal keer mee gewerkt, maar ga nu eens zelfstandig iets opbouwen met OOP: een webshop!

Op dit moment heb ik een opzetje gemaakt m.b.t. de eigenschappen en objecten die ik hiervoor ga gebruiken, waartna ik deze vertaal naar OOP.

Op dit moment heb ik: http://www.speedyshare.com/3WHAu/OOP-webshop.xlsx

Graag zou ik hierop op/aanmerkingen willen ontvangen ter lering voor mijzelf en om een goed startpunt te hebben om verder uit te bouwen!

Daarnaast heb ik nog een vraag over het 'getten' van informatie vanuit database: Stel, je wilt je NAW gegevens getten. Doe je dit dan dmv een array (waarin je adresgegevens etc zet), of doe je dat per element apart (straatnaam, straatnummer, toevoeging ed...)

Roel
Gewijzigd op 29/07/2013 19:22:18 door Roeltje M
 
PHP hulp

PHP hulp

06/11/2024 00:37:33
 
Chris PHP

Chris PHP

30/07/2013 08:03:07
Quote Anchor link
NAW gegevens via $_GET? Waarom wil je die gegevens via de URL doorgeven? Gebruik gewoon $_POST lijkt me stukken makkelijker en zoiezo veiliger.

Tevens, hoe wil je een 'array' meegeven via $_GET?
 
Ward van der Put
Moderator

Ward van der Put

30/07/2013 11:31:29
Quote Anchor link
Je objectmodel is al redelijk goed voor een complete webshop, maar leunt nog iets te veel op een databasestructuur: wat je "objecten" hebt genoemd, zouden databasetabellen kunnen zijn en de "eigenschappen" per object lijken vervolgens op databasevelden.

In het objectmodel mis je misschien daarom ook minstens twee klassen: een voor de database en een voor de webpagina's (of ruimer: views). Dat beantwoordt misschien ook je vraag over het "getten" van data uit de database. Dat implementeer je namelijk niet apart in elk object (voor klant, adres, order, enzovoort), maar handel je centraal af via een databaseklasse.

Met deze basisopzet kun je wel gewoon een eerste concept gaan bouwen; je merkt dan vanzelf waar je extra objecten en klassen nodig hebt.
 
Roeltje M

Roeltje M

30/07/2013 15:33:58
Quote Anchor link
Ik bedoel niet $_GET Chris, bedoel eigenlijk get(). Maar het ophalen van de database gegevens dus.
Ik ga een opzetje maken! Ik merk wel dat ik moeite heb met de vertaling naar code.

Ik moet een class maken voor de database, waarin ik functies als uitvoeren van queries, connecten met database e.d. doe.?
Daarnaast moet ik classes hebben voor Cart, Customer e.d.?
En dan elke x als ik gegevens ophaal uit de database, de query-functie aanroepen vanuit database class (Database::query("SELECT ... FROM ...");?
 
NOLot -

NOLot -

30/07/2013 16:42:04
Quote Anchor link
Was je van plan een framework te gebruiken? Dat is een goede introductie van oop
 
Roeltje M

Roeltje M

30/07/2013 16:48:15
Quote Anchor link
Nee, ga zelf iets bouwen, geen framework.

Toevoeging op 31/07/2013 16:06:37:

Momenteel heb ik dit:

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
<?php

class Mysql_Database implements Database {
    private $_link;
    
    public function connect($server='', $username='', $password='', $new_link=true, $client_flags=0) {
        $this->_link = mysql_connect($server, $username, $password, $new_link, $client_flags);
    }

    
    public function error() {
        return mysql_errno($this->_link);
    }

    
    public function errno() {
        return mysql_error($this->_link);  
    }

    
    public function escape($string) {
        return mysql_real_escape_string($string, $this->_link);  
    }

    
    public function query($query) {
        return mysql_query($query, $this->_link);  
    }

    
    public function fetchArray($result, $array_type = MYSQL_BOTH) {
        return mysql_fetch_array($result, $array_type);  
    }

    
    public function fetchRow($result) {
        return mysql_fetch_row($result);  
    }

    
    public function fetchAssoc($result) {
        return mysql_fetch_assoc($result);
    }

    
    public function fetchObject($result) {
        return mysql_fetch_object($result);  
    }

    
    public function numRows($result) {
        return mysql_num_rows($result);
    }

    
    public function close() {
        return mysql_close($this->_link);
    }
}


class Customer {
    public $_id;    
    public $_address;    
    public $_invoiceaddress;    
    public $_contact;    
    private $_db;
    
    public function getCustomerId() {
        return $this->_id;
    }
    
    
    public function getAddress($id) {
        $_db = Mysql_Database::connect('localhost', 'deb69044_db', 'database', true ,0);
        $_db->query("SELECT adres FROM klanten_factuur_adres WHERE klant_id = ".$id);
        return $_address;
        
    }
}


?>


Is dat een goed begin?
 
Roeltje M

Roeltje M

02/08/2013 21:07:55
Quote Anchor link
Vraag is: moet ik elke keer als ik een functie gebruik connecten? doe ik het zo goed?
 
Erwin H

Erwin H

02/08/2013 21:28:25
Quote Anchor link
Als je nu toch met een database class begint, doe het dan nu goed en ga nu al geen mysql functies er meer in gebruiken. Die functies gaan eruit, dus gebruik ofwel mysqli, ofwel PDO.

Gebruik geen publieke properties, gebruik alleen private properties. Met publieke of protected properties krijg je afhankelijkheden in je code die je later problemen gaan geven als je eens iets wilt veranderen.

Een Customer class zou niet de connectie met de database moeten verzorgen. Als je het zo doet moet je elke class die de database nodig heeft de connectie gegevens geven, dat wil je niet. Maak een aparte connectie (configuratie) class die de connectie gegevens beheert. Dan hoef je alleen die class aan te passen als je eens de applicatie op een andere server installeert.
Overigens denk ik dat uberhaupt de customer class niet direct een database class moet aanroepen. Wat als je morgen eens een andere datasource gaat gebruiken? Dan moet je die Customer class gaan herschrijven, ook dat wil je niet.

Dit kan niet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
Mysql_Database::connect
?>

de methode connect in de database class is niet als static gedefinieerd, dus je kan het niet zo aanroepen. Overigens kan je ook beter niet met static methodes werken, dat heeft weinig voordelen en veel nadelen.

Alles kort samengevat zou ik als ik jou was even terug naar de basis gaan. In een echte OOP omgeving heeft elke class maar 1 doel. Elke class dient om 1 functionaliteit uit te voeren. Denk daarover na elke keer dat je een class ontwerpt. Als een class meer dan 1 doelen dient dan moet je je afvragen of je die class niet beter kan splitsen.
 



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.