[PHP] Arrays in object die in object zijn aangemaakt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb van mijn probleem een versimpeld voorbeeld gemaakt.
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
<?

class Family {
    var $_name   = "";
    var $_members = array();
    
    function Family( $name ) {
        $this->_name = $name;
    }
    
    function createMember( $name ) {
        $member =& new Member( $name );
        
        array_push( $this->_members, $member );
        
        return $member;
    }
    
    function output() {
        $ret = "Family: ". $this->_name ."\n";
        
        foreach( $this->_members as $member ) {
            $ret.= $member->output();
        }
        
        return $ret;
    }
}

class Member {
    var $_name      = "";
    var $_interests = array();
    
    function Member( $name ) {
        $this->_name = $name;
    }
    
    function addInterest( $name ) {
        array_push( $this->_interests, $name );
    }   
    
    function output() {
        $ret = "Interests of familymember ". $this->_name ." :\n";
        
        foreach( $this->_interests as $interest ) {
            $ret.= " - ". $interest ."\n";
        }
        
        return $ret;
    }
    
}

$family = new Family( "Bush" );

$member = $family->createMember( "George" );
$member->addInterest( "Irak" );
$member->addInterest( "War" );
$member->addInterest( "Oil" );

echo $family->output();
?>
Dit geeft de output:
code:
1
2
Family: Bush
Interests of familymember George :

Terwijl dat volgens mij dit zou moeten zijn:
code:
1
2
3
4
5
Family: Bush
Interests of familymember George :
 - Irak
 - War
 - Oil


Het probleem is (dus) dat de array _interests niet 'onthouden' wordt.

Ik draai php 4.1.2, ik kon in de bug list niets vinden.

Acties:
  • 0 Henk 'm!

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Wat geeft var_dump($family->_members) bijvoorbeeld?
Waarom doe je eigenlijk =& bij de new aanroep? Lijkt me ook niet helemaal wat je wil...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
SWfreak schreef op 23 februari 2003 @ 17:02:
Wat geeft var_dump($family->_members) bijvoorbeeld?
code:
1
2
3
4
5
6
7
8
9
10
array(1) {
  [0]=>
  object(member)(2) {
    ["_name"]=>
    string(6) "George"
    ["_interests"]=>
    array(0) {
    }
  }
}

Dat is dus zoals ik bedoelde / vertelde, de array in het object wat ik in het andere object aanmaak is en blijft leeg.
Waarom doe je eigenlijk =& bij de new aanroep? Lijkt me ook niet helemaal wat je wil...
Dan maak ik een referentie naar het nieuwe object, zodat ik niet met kopieen kom te zitten (zonder & maakt niet uit btw).

Acties:
  • 0 Henk 'm!

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Nou ja, dan verder debuggen. Wordt die methode addInterest uberhaupt wel goed aangeroepen? Stop daar eens een echo bijvoorbeeld

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
SWfreak schreef op 23 February 2003 @ 18:02:
Nou ja, dan verder debuggen. Wordt die methode addInterest uberhaupt wel goed aangeroepen? Stop daar eens een echo bijvoorbeeld
Ik doe niet anders! :/ (nofi, ik ben blij dat je wil helpen).

De functie wordt netjes aangeroepen, helemaal zoals het hoort.

Ik ben er nog een keer met Zend Studio er door heen gelopen, en toen stuitte ik nog op iets.

Als ik op (bijv) de laatste regel 'print_r( $member->_interests );' neerzet is dit de output:
code:
1
2
3
4
5
6
7
8
Family: Bush
Interests of familymember George :
Array
(
    [0] => Irak
    [1] => War
    [2] => Oil
)

Wat dus betekent dat de array _interests wel opgeslagen worden, maar dat ik hem in Member::output() niet goed aanspreek.

Als ik daar kijk hoeveel elementen _interests heeft zijn dat er dan ook 0.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Zo te zien zit je toch met twee verschillende members opgescheept, php is zo heerlijk transparant hierin (not) dus echt prettig debuggen is het niet, waar het hem inzit kan ik zo niet zien, korte tests lukten me iig niet het te op te lossen...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zoals ACM al zei zit (zat) ik opgescheept met twee members, na wat gerommeld te hebben met de &'tjes lukte het:
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
<?

class Family {
    var $_name   = "";
    var $_members = array();
    
    function Family( $name ) {
        $this->_name = $name;
    }
    
    function createMember( $name ) {
        $member = new Member( $name );
        
        array_push( $this->_members, $member );
        
        return $member;
    }
    
    function output() {
        $ret = "Family: ". $this->_name ."\n";
        
        foreach( $this->_members as $member ) {
            $ret.= $member->output();
        }
        
        return $ret;
    }
}

class Member {
    var $_name      = "";
    var $_interests = array();
    
    function Member( $name ) {
        $this->_name = $name;
    }
    
    function addInterest( $name ) {
        array_push( $this->_interests, $name );
    }   
    
    function output() {
        $ret = "Interests of familymember ". $this->_name ." :\n";
        
        foreach( $this->_interests as $interest ) {
            $ret.= " - ". $interest ."\n";
        }
        
        return $ret;
    }
    
}

$family = new Family( "Bush" );

$member =& $family->createMember( "George" );
$member->addInterest( "Irak" );
$member->addInterest( "War" );
$member->addInterest( "Oil" );

echo $family->output();
?>

En nu werkt het wel!

Alleen is het een beetje jammer dat ik nu niet helemaal snapt wáárom het werkt.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Verwijderd schreef op 23 February 2003 @ 23:04:

Alleen is het een beetje jammer dat ik nu niet helemaal snapt wáárom het werkt.
Als ik het goed zie heb je je & van binnen createMember "voor de new" verplaatst naar "voor de call". Dat het nu wel werkt is iphpso (in PHP's strange opninion ;) ) verklaarbaar vanwege de "return by reference" grappen van PHP. "=" maakt altijd een copy, "&=" maakt een reference.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nu wordt er dus in Family::createMember een nieuwe copy van Member gemaakt.
Die wordt in een array gestopt en met de referentie van die nieuwe copy ga ik weer verder werken.

Eigenlijk is het best logisch als het werkt 8).

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

offtopic:
Je kunt in plaats van array_push ook de wat lekkerdere notatie
code:
1
$array []= 'New array member';
gebruiken :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1