[PHP] Klasse voor een lijst

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik weet dat er een standaard oplossing in het OOP was voor het volgende probleem, maar ik kan het niet vinden. Ik heb dus een bepaalde klasse waarvan de properties vanuit een database worden gevuld. Deze database is een tabel met daarin alle entiteiten waarvan via de klasse een object kan worden gemaakt.

Mijn vraag is hoe ik het het beste kan aanpakken als ik een lijst wil van al deze "nog niet objecten". Moet ik hiervoor een aparte lijst klasse aanmaken PER klasse dus bijvoorbeeld de lijst-klasse personen voor de klasse persoon. Of is hier een betere oplossing voor?

Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
Je kan natuurlijk altijd een algemene Collection/List class aanmaken (bijv met behulp van de SPL interfaces Interator en Countable).

Voordeel van een class die Iterator implementeerd is dat je em in foreach loops als een array kan behandelen, bijvoorbeeld:

PHP:
1
2
3
4
5
$collection = new Collection(array($persoon1, $persoon2));

foreach ($collection as $persoon) {
  echo $persoon->naam;
}


http://www.php.net/spl

Ik snap alleen niet wat je bedoeld met "nog niet objecten"?

[ Voor 4% gewijzigd door twiekert op 14-03-2006 19:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met "nog niet objecten" bedoel ik dat het alleen nog maar database-data is en nog niet objecten. Ik wil niet van elke rij in de database tabel een object gaan aanmaken alleen om een lijst hiervan weer te geven.

Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
Dan zou je het in een array kunnen stoppen, maar als het in een database staat dan stelt het 'iets' voor, waarom zou je er dan geen object van kunnen maken? Het is tenslotte een rij van gegevens waarvan de samenstelling iets betekent.

Als je een persoon class hebt en je wilt vervolgens een lijst van personen weergeven dan is een collectie van persoon objecten juist de manier om dat te doen. Het aanmaken van persoon object(en) met de rauwe database gegevens is de taak van een data access object/laag.

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

twiekert: Omdat je helemaal zin hebt om je database helemaal leeg te trekken alleen omdat je een lijstje van die personen nodig hebt? Tenminste, ik denk dat de TS niet een "full" object wil maken, maar dat is helemaal niet nodig om toch jouw idee uit te voeren.

Als ik het probleem tenminste goed begrijp wil de TS een lijst weergeven van bijvoorbeeld de personen in de database. Om dat voor elkaar te krijgen wil hij alles wat hij nog niet in een object getoverd heeft omzetten in een lijstje, om die te combineren met de collectie van de al gerealiseerde volle objecten?

Maar kan je, /me niet een stuk beter een collection class maken die alle al gerealiseerde objecten op basis van id bijhoud, en desgevraagd bijvult met wel degelijk objecten voor alle id's, maar dan alleen gevuld met relevante data?

DM!


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Ik maak tegenwoordig meestal twee klassen om dit probleem op te lossen. De eerste stelt het daadwerkelijke object voor, een user, product whatever. De tweede is een collection klasse die een aantal methoden bevat om een groep objecten te creëren op basis van database gegevens, en een generieke methode om ze uit te lezen (voorbeeld volgt).
In zo'n methode om gegevens op te halen kun je er voor kiezen om slechts een deel van de mogelijke properties van de objecten te zetten. Zolang je daar in de verdere implementatie rekening mee kunt houden levert dat geen problemen op.

Anyway, iets van 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
<?php

class example {

    var $id;
    var $helpText;

    function show() {
        echo $this->helpText;
    }
}




class exampleCollection {

    var $DB;
    var $examples = array();

    
    //__construct
    function exampleCollection() {
        $this->DB = DB::getInstance();
    }

    
    // fetches all examples from the database that are
    // relevant for the specified context
    function loadExamplesByContextId($contextId) {
        $sql = sprintf('
                SELECT `exampleid`, `helptext` 
                FROM `examples` 
                WHERE `contextid` = %d',
            $contextId);

        if ($this->DB->query($sql)) {

            while($row = $this->DB->fetchRow()) {
                $example = new example();
                $example->id = $row['exampleid'];
                $example->helpText = $row['helptext'];
                
                array_push($this->examples, $example);
            }

            return TRUE;
        }
        $error = new error(mysql_error());
        $error->doSomething();
        return FALSE;
    }


    // iterates over the examples contained in the collection
    // returning an example each time it is called. Returns
    // false at the end of the collection
    function fetchExample() {
        static $i = 0;

        if (isset($this->examples[$i])) {
            return $this->examples[$i++];
        } else {
            $i = 0;
            return FALSE;
        }
    }
}

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
Aha, nu snap ik het :P. Je bedoelt een Proxy object met eventueel een lazy loading mechanisme. Het proxy object heeft alleen de minimale gegevens om het echte business object te identificeren (bijv alleen een primary key en een achternaam voor een klant).
Lazy loading zorgt er vervolgens voor dat het complete business object wordt ingeladen zodra er andere attributen worden opgevraagd die de Proxy niet heeft.

Iets meer info over het Proxy pattern: http://en.wikipedia.org/wiki/Proxy_pattern

Er zijn verschillende oplossingen voor dit 'probleem', een echte standaard is er voor zover ik weet niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JHS schreef op dinsdag 14 maart 2006 @ 22:28:
twiekert: Omdat je helemaal zin hebt om je database helemaal leeg te trekken alleen omdat je een lijstje van die personen nodig hebt? Tenminste, ik denk dat de TS niet een "full" object wil maken, maar dat is helemaal niet nodig om toch jouw idee uit te voeren.

Als ik het probleem tenminste goed begrijp wil de TS een lijst weergeven van bijvoorbeeld de personen in de database. Om dat voor elkaar te krijgen wil hij alles wat hij nog niet in een object getoverd heeft omzetten in een lijstje, om die te combineren met de collectie van de al gerealiseerde volle objecten?

Maar kan je, /me niet een stuk beter een collection class maken die alle al gerealiseerde objecten op basis van id bijhoud, en desgevraagd bijvult met wel degelijk objecten voor alle id's, maar dan alleen gevuld met relevante data?
Ik denk dat ik dit maar doe ja, de andere oplossingen zorgen ervoor dat ik allemaal objecten aanmaak vaanwav ik wellicht alleen het "name" veld even zie in een lijst...
Pagina: 1