ophalen gegevens mbv OO objecten.. welke benadering?
ik ben bezig met een klein CMS systeempje op mijn werk, wat we intern willen gaan gebruiken om kleine website-jes op een gemakkelijke manier te gaan uitrollen, Het systeem is nog in een baby-stadium, (al heb ik al wel een verbinding opgebouwd met de database en een aantal overzichten uitgebouwd op mijn webservertje),
en een van de vragen die nu rijst is wat is een goede benadering om gegevens op te halen en te objecten te vullen? ik zal een klein fictief voorbeeld geven:
(voorbeeld 1)
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
// de gebruiker heeft een website geselecteerd, hier heb het id-tje van
$oWebsite = new Website($id); // aanmaken website object. vandaar $o .
$aWebsite -> ophalen(); // ophalen geeft een array met de gegevens van de site( key / value etc)
// attributes/toestand van website object vullen:
$oWebsite -> setDomeinnaam($aWesite['domeinnaam']);
$oWebsite -> setItemZus($aWesite['itemzus']);
$oWebsite -> setItemZo($aWesite['itemzo']);
// etc..
?>
// de gebruiker heeft een website geselecteerd, hier heb het id-tje van
$oWebsite = new Website($id); // aanmaken website object. vandaar $o .
$aWebsite -> ophalen(); // ophalen geeft een array met de gegevens van de site( key / value etc)
// attributes/toestand van website object vullen:
$oWebsite -> setDomeinnaam($aWesite['domeinnaam']);
$oWebsite -> setItemZus($aWesite['itemzus']);
$oWebsite -> setItemZo($aWesite['itemzo']);
// etc..
?>
en als ik dan verderop in de code of in de html iets nodig heb doe ik dus
(voorbeeld 2)
ik zou de logica om het object te vullen in de class methods kunnen wegwerken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$oWebsite -> new Website($id);
$oWebsite -> ophalen(); // hier handelt het object het vullen van zijn eigen attributes af zoals:
public function ophalen ($id) {
try {
select * where id = $id // even simpel gezegd
result -> stmt->execute();
$this -> attribuutjeZus = result[atribuutjeZus]
$this -> atribuutjeZo = result[attribuutjeZo]
}
catch (PDOException ex) {
// haaandle it etc
}
}
?>
$oWebsite -> new Website($id);
$oWebsite -> ophalen(); // hier handelt het object het vullen van zijn eigen attributes af zoals:
public function ophalen ($id) {
try {
select * where id = $id // even simpel gezegd
result -> stmt->execute();
$this -> attribuutjeZus = result[atribuutjeZus]
$this -> atribuutjeZo = result[attribuutjeZo]
}
catch (PDOException ex) {
// haaandle it etc
}
}
?>
De vraag is wat kan ik het beste doen? misschien idee-en?
bij voorbaat dank,
Stefan
Code tags toegevoegd, graag voortaan je code tussen [code] en [/code] te plaatsen (en <?php voor PHP highlighting). Alvast bedankt![/modedit]
Gewijzigd op 14/05/2014 10:19:26 door Wouter J
$oWebsite -> new Website($id);
Intern laat je de constructor van de class Website() dan het object vullen met een private function fetchById($id) of iets dergelijks. Er is geen reden om een object "handmatig" te initialiseren door zelf steeds $oWebsite -> ophalen() aan te roepen.
en ik heb geen arrays meer nodig (die implementatie details bevatten over hoe de attributen in de database heten.. waarvan ik al aanvoelde dat het tegen de OO indruist)
tx :)
De WebsiteBuilder zorgt dan dat hij alle informatie ophaalt en die invoegt in Website. Website bestaat dan uit praktisch niks anders dan een verzameling getters/setters.
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
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
<?php
class WebsiteBuilder
{
/** @var Database */
private static $db;
public static function setDb(Database $db)
{
$this->db = $db;
}
public static function create()
{
return new self(); // een nieuwe instance van zichzelf
}
public function createWebsiteById($id)
{
// merk op dat dit dummy code is, deze database heeft nog wat normalizatie nodig :)
$result = $this->db->getResult(
'SELECT title, slogan, theme FROM website_data WHERE id = ?',
array($id)
);
// maak een nieuw Website object met de informatie
$website = new Website($result['title'], $result['theme']);
$website->addParameter('slogan', $result['slogan']);
return $website;
}
}
class Website
{
private $title;
private $theme;
private $parameters = array();
public function __construct($title, $theme)
{
$this->title = $title;
$this->theme = $theme;
}
public function addParameter($name, $value)
{
$this->parameters[$name] = $value;
}
}
?>
class WebsiteBuilder
{
/** @var Database */
private static $db;
public static function setDb(Database $db)
{
$this->db = $db;
}
public static function create()
{
return new self(); // een nieuwe instance van zichzelf
}
public function createWebsiteById($id)
{
// merk op dat dit dummy code is, deze database heeft nog wat normalizatie nodig :)
$result = $this->db->getResult(
'SELECT title, slogan, theme FROM website_data WHERE id = ?',
array($id)
);
// maak een nieuw Website object met de informatie
$website = new Website($result['title'], $result['theme']);
$website->addParameter('slogan', $result['slogan']);
return $website;
}
}
class Website
{
private $title;
private $theme;
private $parameters = array();
public function __construct($title, $theme)
{
$this->title = $title;
$this->theme = $theme;
}
public function addParameter($name, $value)
{
$this->parameters[$name] = $value;
}
}
?>