ophalen gegevens mbv OO objecten.. welke benadering?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Php rookie

php rookie

14/05/2014 09:52:23
Quote Anchor link
Beste mensen (PHP/OO gurus!),

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)
PHP script in nieuw venster Selecteer het PHP script
1
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..
?>


en als ik dan verderop in de code of in de html iets nodig heb doe ik dus
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$oWebsite
->getDomeinnaam()
$oWebsite->getItemZus()
// ...
?>



(voorbeeld 2)
ik zou de logica om het object te vullen in de class methods kunnen wegwerken:
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
<?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
   }
}

?>


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
 
PHP hulp

PHP hulp

23/11/2024 18:51:30
 
Ward van der Put
Moderator

Ward van der Put

14/05/2014 10:05:11
Quote Anchor link
Dan kun je het ook beperken tot een 3e variant. Kortweg:

$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.
 
Php rookie

php rookie

14/05/2014 10:18:42
Quote Anchor link
ja klinkt inderdaad als een redelijke oplossing, want hierna kan ik gewoon alles met de getters ophalen,
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 :)
 
Wouter J

Wouter J

14/05/2014 10:22:37
Quote Anchor link
Ik zou voor geen van beide kiezen. Je Website object wordt het object dat data vasthoudt. Die moet dan ook nog niet eens zichzelf gaan aanmaken. Dan krijg je namelijke 2 verantwoordelijkheden en dat betekend dus 2 klassen. Dus je krijgt dan een WebsiteBuilder en een Website object:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$website
= WebsiteBuilder::create()
    ->
createWebsiteById($id);
?>

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.
 
Php rookie

php rookie

14/05/2014 14:30:49
Quote Anchor link
Dat is inderdaad een aardig idee om het te splitsen inderdaad (splitsing van verantwoordelijkheden / seperation of concerns inderdaad, ik ben wel beniewd waar ik methods als ophalen bijwerken verwijderen etc moet laten ?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo 'Thanks!'; ?>
 
Wouter J

Wouter J

14/05/2014 17:19:04
Quote Anchor link
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
<?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;
    }
}

?>
 



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.