[ALG] of [PHP] Juiste object aanmaken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 00:23
Ik worstel hier al een tijdje mee, maar weet nog niet echt een oplossing. Meestal bouw ik er wat omheen, maar ik wil nu wel een betere oplossing weten.

De situatie is als volgt:
• ik weet 'nul komma weinig' van PHP
• ik ken basis OOP en gebruik dat wel binnen Delphi
• ik zoek een mooie oplossing

Sterk vereenvoudigd voorbeeld van de zoekmachine die ik voor intern gebruik maak:
Voorbeeld:

SQL:
1
2
3
4
5
6
7
8
CREATE VIEW voorbeeldview as
  SELECT 'P' as Type, ID, Naam FROM printers
  UNION
  SELECT 'C' as Type, ID, Naam FROM computers
  UNION
  SELECT 'U' as Type, ID, Naam FROM users
  UNION
  SELECT 'G' as Type, ID, Naam FROM groups


Nu ga ik hierin zoeken middels:
SQL:
1
SELECT Type, ID, Naam FROM voorbeeldview WHERE Naam like '%A%' ORDER BY Naam


Hieruit krijg je dus een tabel als:
TypeIDNaam
G3AAAA
C7BAAAAdf
U2Cdfasd
G1Dfdgsdfa
P5Egcsda


Om deze items juist op het scherm te krijgen heb ik het volgende basis object:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ZoekItem {
    protected $tabel;
    protected $keyid;
    protected $naam;
    protected $omschrijving;
    function __CONSTRUCT($Tabel, $KeyID, $Naam){
        $this->tabel=$Tabel;
        $this->keyid=$KeyID;
        $this->naam=$Naam;
        $this->omschrijving='';
    }
    function getOmschrijving(){
        return '';
    }
    function ItemToStr(){
        return "KORT:".$this->naam."<BR>".$this->getOmschrijving();
    }
}


Met 4 afgeleidde objecten, waar de getOmschrijving functie zo is ingevuld dat deze de informatie uit de database haalt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class UserItem extends ZoekItem {
    function getOmschrijving(){
        if ($this->omschrijving=="") {
            /* Haal info uit database en zet deze in $this->omschrijving */
        }
        return $this->omschrijving;
    }
}

class ComputerItem extends ZoekItem {
    function getOmschrijving(){
        if ($this->omschrijving=="") {
            /* Haal info uit database en zet deze in $this->omschrijving */
        }
        return $this->omschrijving;
    }
}

enz...


Om de items op het scherm zetten wil ik allemaal toepasselijke objecten maken. En daar zit nu juist mijn probleem. Mijn script moet zich bewust zijn van alle type objecten. Dat los ik nu op m.b.v. een extra functie:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function CreateZoekItem($Tabel, $KeyID, $Naam){
    switch($Tabel){
        case "U";
            return new UserItem($Tabel, $KeyID, $Naam);
            break;
        case "C";
            return new ComputerItem($Tabel, $KeyID, $Naam);
            break;
        case "G";
            return new GroepItem($Tabel, $KeyID, $Naam);
            break;
        case "P";
            return new PrinterItem($Tabel, $KeyID, $Naam);
            break;
        default:
            return new ZoekItem($Tabel, $KeyID, $Naam);
    }
}


Maar... dit wil ik dus niet. Ik zou willen dat mijn basisobject bekend is met zijn eigen afgeleidde objecten. En zodra het basisobject wordt aangemaakt hij een afgeleidde teruggeeft.

Dus dat ik kan doen:
PHP:
1
$item=new ZoekItem($Tabel, $KeyID, $Naam);

en dat het type dat terugkomt afhankelijk is van de waarde van $Tabel.

Hoe doe ik dit?

[ Voor 5% gewijzigd door jvdmeer op 22-03-2006 19:48 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Met het factory design pattern? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 00:23
Zover ik nu kan zien op bijv. Wikipedia doe ik dat nu al, alleen hanteer ik een normale functie i.p.v. een abstracte class.

Is het niet mogelijk om de object selectie automtaisch te laten plaatsvinden? Dus als ik de een nieuw afgeleid type bv. Shares aanmaak, dat dan er automagisch alle subclassen wordt langsgegaan om te kijken welke juist is en dat deze wordt aangemaakt?

Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt iets doen als:

$instance = new $className ( $arg1, ... );

Waarbij $className dan een string is, bijvoorbeeld "ComputerItem".
Wel zorgvuldig mee omgaan natuurlijk. Het kan je een hoop tijd besparen, maar het kan je ook een hoop ellende bezorgen als je niet netjes eerst controleert of de class wel bestaat enzo.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Abstracte factories zijn net iets anders dan waar ik op doelde. Probeer deze maar even. Voor zover ik zo kan zien is die beter toepasbaar om jouw probleem op te lossen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.