[PHP5] Objecten in een Array

Pagina: 1
Acties:
  • 361 views sinds 30-01-2008
  • Reageer

  • jverdeyen
  • Registratie: Februari 2006
  • Laatst online: 11-07-2024
Hoi,

Ik ben een kleine applicatie aan het schrijven. Nu heb ik al even zitten piekeren over een oplossing voor volgend "probleem".

Heel concreet:

Twee soorten objecten
  • Rekening
  • Verkoop
Een Rekening bestaat uit:
  • Een Array van Verkoop Objecten
  • ... nog andere gegevens
on

Een Verkoop Object bestaat uit artikels, prijs, korting etc...

Aangezien ik een functie heb onder de klasse Rekening, nl. addVerkoop,
die ervoor zorg dat de Array aangevuld met het meegegeven Verkoop Object.

addVerkoop basis :
PHP:
1
2
3
4
function addVerkoop($verkoop)
    {
        array_push($this->verkopen,$verkoop);
    }


Is het nu mogelijk om deze objecten opnieuw te recupureren (op te halen) uit dit Rekening Object ?

Ik heb al volgende methode gebruikt,

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$verkoop1 = new Verkoop();
$verkoop1->setAantal(1);
$verkoop1->setKorting(10);
$verkoop1->setArtikel(56);

$verkoop2 = new Verkoop();
$verkoop2->setAantal(5);
$verkoop2->setKorting(20);
$verkoop2->setArtikel(53);

$rekening = new Rekening();
$rekening->addVerkoop($verkoop1);
$rekening->addVerkoop($verkoop2);

$i=0;
$lijst = $rekening->getVerkopen();

while ( $i < sizeof($lijst) )
{
    echo $lijst[$i]->getArtikel()."<br/>";
    $i++;
}


Dit is maar een demo code om te zien hoe ik dit later correct kan aanpakken.

Nu, deze manier werkt, maar is dit wel de juiste manier van werken ? Of zit ik hier maar te klooien aan iets dat later voor probs kan zorgen ?

Thx

[ Voor 4% gewijzigd door jverdeyen op 01-06-2007 17:36 ]


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

gaat op zich goed zo toch?

Ik ben alleen zelf niet zon voorstander van nutteloze getters en setters:

PHP:
1
2
3
4
$Rekening = new Rekening();
$Rekening->verkopen[] = $verkoop1; // [] zorgt voor gelijk adden aan array

print_r($rekening->verkopen);

[ Voor 8% gewijzigd door SchizoDuckie op 01-06-2007 17:34 ]

Stop uploading passwords to Github!


  • jverdeyen
  • Registratie: Februari 2006
  • Laatst online: 11-07-2024
SchizoDuckie schreef op vrijdag 01 juni 2007 @ 17:33:
gaat op zich goed zo toch?

Ik ben alleen zelf niet zon voorstander van nutteloze getters en setters:

PHP:
1
2
3
4
$Rekening = new Rekening();
$Rekening->verkopen[] = $verkoop1; // [] zorgt voor gelijk adden aan array

print_r($rekening->verkopen);
Ok thx.
Dus zo mag ik effectief verderwerken ?

De addVerkoop functie gaat nog vanalles nakijken ... gewoon toevoegen aan de array maakt dit wrs niet mogelijk ?

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
SchizoDuckie schreef op vrijdag 01 juni 2007 @ 17:33:
gaat op zich goed zo toch?

Ik ben alleen zelf niet zon voorstander van nutteloze getters en setters:
Ik ben zelf niet zo'n voorstander van openstellen van code onderdelen waar andere componenten geen fuck mee te maken hebben.

Ooit gehoord van encapsulatie, design by contract, en aanverwanten?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 20-10 21:46

KompjoeFriek

Statsidioot

Getters en Setters zijn zeker niet nutteloos.

Zeker als hij ook nog dit zegt:
jverdeyen schreef op vrijdag 01 juni 2007 @ 17:37:
[...]
De addVerkoop functie gaat nog vanalles nakijken ... gewoon toevoegen aan de array maakt dit wrs niet mogelijk ?
Je demo code ziet er in mijn ogen wel netjes uit.

ipv
PHP:
1
2
3
4
$verkoop1 = new Verkoop();
$verkoop1->setAantal(1);
$verkoop1->setKorting(10);
$verkoop1->setArtikel(56);
zou je nog kunnen overwegen om die dingen als parameter in je "constructor" mee te nemen zodat die aanroep bv zoiets word:
PHP:
1
$verkoop1 = new Verkoop(1, 10, 56);

WhatPulse! - Rosetta@Home - Docking@Home


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Grijze Vos schreef op zaterdag 02 juni 2007 @ 00:49:
[...]

Ik ben zelf niet zo'n voorstander van openstellen van code onderdelen waar andere componenten geen fuck mee te maken hebben.

Ooit gehoord van encapsulatie, design by contract, en aanverwanten?
Daar gaan accessors/mutators je niet bij helpen. Encapsulatie word impliciet nog steeds gebroken omdat je alsnog de ingewanden van je object blootstelt aan de buitenwereld, zei het via een workaround. Wat design by contract er mee te maken heeft is me vaag, als je correctheid wilt garanderen moet je je properties überhaupt moet bekend maken.

Ooit gehoord van het Hollywood principle, Inversion of control of gewoonweg goed object georiënteerd ontwerpen?

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 19-11 13:44

Spockz

Live and Let Live

Ehm. Als jij nog extra checks wilt uitvoeren voordat je een item aan dat array toevoegt zul je toch echt een setter moeten gebruiken aangezien je geen properties hebt zoals je die in Delphi hebt. :)

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


  • Alex Picard
  • Registratie: November 2005
  • Laatst online: 19-11 00:56
In plaats van
PHP:
1
2
3
4
5
6
7
8
$i=0;
$lijst = $rekening->getVerkopen();

while ( $i < sizeof($lijst) )
{
    echo $lijst[$i]->getArtikel()."<br/>";
    $i++;
}

Zou ik aanraden:
PHP:
1
2
3
4
$lijst = $rekening->getVerkopen();
foreach ($lijst as $verkoop) {
    echo $verkoop->getArtikel()."<br/>";
}

Tenzij de index i belangrijk is, maar dat is deze meestal niet.

  • jverdeyen
  • Registratie: Februari 2006
  • Laatst online: 11-07-2024
Alex Picard schreef op zaterdag 02 juni 2007 @ 15:42:
In plaats van
PHP:
1
2
3
4
5
6
7
8
$i=0;
$lijst = $rekening->getVerkopen();

while ( $i < sizeof($lijst) )
{
    echo $lijst[$i]->getArtikel()."<br/>";
    $i++;
}

Zou ik aanraden:
PHP:
1
2
3
4
$lijst = $rekening->getVerkopen();
foreach ($lijst as $verkoop) {
    echo $verkoop->getArtikel()."<br/>";
}

Tenzij de index i belangrijk is, maar dat is deze meestal niet.
Owh nice, hij gaat effectief het object gebruiken dan.

@kompjoefriek

In mijn contructor(s) doe ik meestal een unset van alle variabelen,
een reden kan ik niet meteen geven ... gewoonte wrs.
Nu gebruik ik wel een init() functie waar 'k de paramters dan in meegeef,
dat is ongeveer dezelfde manier van werken.

Verder thx voor de info,
hierbij heb ik weer massas bijgeleerd.

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 19-11 13:44

Spockz

Live and Let Live

Ik zou eigenlijk nog wel zo ver willen gaan dat je beter:

PHP:
1
foreach ($rekening->getVerkopen() as $verkoop) { /*...*/ }

kan gebruiken omdat je nu niet een hele lange lijst kopieert. En het zou nog mooier zijn als je met een reference werkt, maar die zijn bij PHP in de praktijk trager. :(

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 09-10 21:36
Alex Picard schreef op zaterdag 02 juni 2007 @ 15:42:
Tenzij de index i belangrijk is, maar dat is deze meestal niet.
Ook als de index belangrijk is zou ik de 'foreach' constructie aanraden. En het is denk ik niet echt zinvol om eerst 2 strings aan elkaar te plakken en daarna te echo'en. Beide strings achter elkaar aan echo'en werkt ook prima.
PHP:
1
2
3
foreach ($lijst as $key => $verkoop) {
    echo $key, ': ', $verkoop->getArtikel(), '<br/>'; 
}

  • jverdeyen
  • Registratie: Februari 2006
  • Laatst online: 11-07-2024
de echo speelt niet zoveel rol,
dat was puur om de code te testen.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Alex Picard schreef op zaterdag 02 juni 2007 @ 15:42:
Tenzij de index i belangrijk is, maar dat is deze meestal niet.
In welk geval je altijd nog dit kan doen:
PHP:
1
2
foreach($lijst as $i => $object)
{}
Spockz schreef op zaterdag 02 juni 2007 @ 15:54:
kan gebruiken omdat je nu niet een hele lange lijst kopieert. En het zou nog mooier zijn als je met een reference werkt, maar die zijn bij PHP in de praktijk trager. :(
Je kopieert de lijst helemaal niet, PHP werkt standaard intern met referenties die volgens het copy-on-change principe aangepast worden zodra dat nodig is. Zolang je de array dus niet wijzigt maar enkel uitleest maakt ie er ook geen echte copy van, maar bij de reference die jij liever hebt moet ie wel wat andere administratie bijhouden.

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 19-11 13:44

Spockz

Live and Let Live

Je kopieert de lijst helemaal niet, PHP werkt standaard intern met referenties die volgens het copy-on-change principe aangepast worden zodra dat nodig is. Zolang je de array dus niet wijzigt maar enkel uitleest maakt ie er ook geen echte copy van, maar bij de reference die jij liever hebt moet ie wel wat andere administratie bijhouden.
Ok. Sorry, my bad. :)

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8

Pagina: 1