[PHP/OOP] data tussen 2 objecten uitwisselen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • -J00P-
  • Registratie: September 2004
  • Laatst online: 20-09 16:45
Om te beginnen heb ik de volgende 2 classes

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
class a {
    var $attrib;
    
    function a () {
        $this->attrib = 'value1';
    }

    function getattrib() {
        return $this->attrib;
    }
}

class b {
    var $objA;

    function b ($objA) {
        $this->objA = $objA;
    }

    function getattrib() {
        return $this->objA->getattrib();
    }

    function setattrib($var) {
        $this->objA->attrib = $var;
    }
}


Ik heb dus 2 objecten. B is afhankelijk van A. B kan de attributen van A opvragen en wijzigen
maar wanneer ik nu de volgende code uitvoer....

PHP:
1
2
3
4
5
6
7
8
9
$objA = new a();
$objB = new b($objA);

echo $objA->getattrib();    //geeft 'value1'
echo $objB->getattrib();    //geeft 'value1'

$objB->setattrib('value2');  //verander attrib
echo $objA->getattrib();   //geeft 'value1'
echo $objB->getattrib();   //geeft 'value2'


krijg ik in mijn ogen onlogische uitvoer.
Mijn opzet was dat ik met objB de attributen van objA kon wijzigen. Maar het lijken 2 verschillende objecten. Waardoor $objA niet wordt veranderd.
Hoe kan ik er voor zorgen dat ik wel het juiste resultaat krijg?

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Werk je met php4? Zo ja, dan moet je een & gebruiken om het object by reference mee te geven ipv een kopie.


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
class a {
    var $attrib;
    
    function a () {
        $this->attrib = 'value1';
    }

    function getattrib() {
        return $this->attrib;
    }
}

class b {
    var $objA;

    function b (&$objA) {
        $this->objA =& $objA;
    }

    function getattrib() {
        return $this->objA->getattrib();
    }

    function setattrib($var) {
        $this->objA->attrib = $var;
    }
}

[ Voor 73% gewijzigd door Brakkie op 05-04-2005 15:52 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • Huppie
  • Registratie: Mei 2003
  • Laatst online: 02-09 09:59
Je zult even moeten kijken naar 'Passing By Reference' :)

*knip*

Hiero een linkje: http://nl3.php.net/references
PHP:
1
2
3
<?php
$objB = new b(&$objA);
?>

edit:
Ik zie de reference al staan, je moet 'm alleen ook meegeven bij het toewijzen

[ Voor 49% gewijzigd door Huppie op 05-04-2005 15:57 ]

Proud member of TCF - D2OL is zooooo 2005


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21-09 12:54
Er wordt door PHP een copy van het object gemaakt, je hebt dus geen referentie meer naar het originele object. Als je het orginele object veranderd, veranderd de copy dus niet. Dat is het fenomeen wat er bij jouw optreed. Om wel naar het juiste object te verwijzen en die te manipuleren moet je gebruik van de amperstand, &.

Op php.net kun je meer informatie vinden over references.

Dit verhaal geldt btw voor PHP versie 4, gezien je var in je classen neem ik aan dat je die versie gebruikt en het probleem. Als je gebruik maakt van PHP5 wordt het door PHP automatisch een reference naar het orginele object.

Acties:
  • 0 Henk 'm!

  • -J00P-
  • Registratie: September 2004
  • Laatst online: 20-09 16:45
dank =) k ga t proberen

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Ik zie de reference al staan, je moet 'm alleen ook meegeven bij het toewijzen
Volgens mij hoeft dat niet.

[ Voor 4% gewijzigd door Brakkie op 05-04-2005 16:01 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Brakkie schreef op dinsdag 05 april 2005 @ 16:01:
[...]


Volgens mij hoeft dat niet.
Sterker nog,
Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer
Pagina: 1