Begin met OOP webshop
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
Tevens, hoe wil je een 'array' meegeven via $_GET?
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.
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 ...");?
Was je van plan een framework te gebruiken? Dat is een goede introductie van oop
Toevoeging op 31/07/2013 16:06:37:
Momenteel heb ik dit:
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
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;
}
}
?>
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?
Vraag is: moet ik elke keer als ik een functie gebruik connecten? doe ik het zo goed?
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:
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.