[OOP] Parent - Child - Object Collections

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Tommy Masschelein

Tommy Masschelein

06/09/2007 11:11:00
Quote Anchor link
Ik zal direct maar met de deur in huis vallen. Ik heb dus een parent class (Foo) die childs aanmaakt en de naam van de child class opslaat in een object collection. Nu is het zo dat het Child van naam kan veranderen. [bar->Rename]. Als dit gebeurt dan wil ik dat de object collection van de parent mee gewijzigd wordt....
Zogezegd zo gedaan. foo->Modify_Collection. Alleen is het resultaat niet wat ik verwacht had.

Vanuit de child roep ik de functie aan met parent::Modify_Collection('New_Name'); deze functie zou er dus moeten voorzorgen dat de vorige naam uit de object collection geunsetted wordt en er een nieuwe bijgestopt wordt.

Het probleem is nu dat ik wel $this gebruik in de functie van de parent, maar doordat ik de functie vanuit de child oproept, blijkt de $this te slaan op het child object... Met gevolgd dat de object collection uit de parent ongewijzigd blijft en object collection van het child wel gewijzigd wordt.
Wat kan ik hieraan doen ?

:: clsFooBar.php ::
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
    class Foo {
        public $Child_Collection = array();
        function
Modify_Collection($Old_Child_Name,$New_Child_Name) {
            unset($this->Child_Collection[$Old_Child_Name]);
            $this->Child_Collection[] = $New_Child_Name;
            return TRUE;
        }
        function
Create_Child($Child_Name) {
            $Child_Instance = new Bar($Child_Name);
            $this->Child_Collection[] = $Child_Name;
            return $Child_Instance;
        }
    }

    
    class Bar extends Foo {
        public $Name = '';
        
        function
__construct($Child_name) {
            $this->Name = $Child_name;
        }
        function
Rename($New_Name) {
            if (parent::Modify_Collection($this->Name,$New_Name)) {
                $this->Name = $New_Name;
            }
        }
    }

?>


:: index.php ::
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
error_reporting(E_ALL);
require_once('clsFooBar.php');
$foo_parent = new Foo;
$bar_child = $foo_parent->Create_Child('PHPhulp');
echo 'Bar Childs Name : ' . $bar_child->Name . '<br />';

echo 'Parent::Child Collection [voor Rename function]';
echo '<pre>' . print_r($foo_parent->Child_Collection,TRUE) . '</pre>';
echo '<hr />';

$bar_child->Rename('pluhPHP');

echo 'Parent::Child Collection [na Rename function]';
echo '<pre>' . print_r($foo_parent->Child_Collection,TRUE) . '</pre>';
echo '<hr />';

echo 'Bar Childs Name : ' . $bar_child->Name . '<br />';
echo 'Child::Child Collection [na Rename function]';
echo '<pre>' . print_r($bar_child->Child_Collection,TRUE) . '</pre>';
echo '<hr />';
?>


:: Output ::
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Bar Childs Name : PHPhulp
Parent::Child Collection [voor Rename function]

Array
(
    [0] => PHPhulp
)

Parent::Child Collection [na Rename function]

Array
(
    [0] => PHPhulp
)

Bar Childs Name : pluhPHP
Child::Child Collection [na Rename function]

Array
(
    [0] => pluhPHP
)
 
PHP hulp

PHP hulp

22/12/2024 23:39:07
 
Peter Dorn

Peter Dorn

06/09/2007 11:56:00
Quote Anchor link
Als je een Parent aanmaakt, en vervolgens een Child extend door die ook aan te maken, heb je 2x een Parent, en 1x een Child

De Child include de Parent namenlijk ook een keer. Opzich niets mis mee, maar daardoor heb je 2x een Parent content. Wil je er voor zorgen dat je maar met 1 content te maken hebt, moet je de Parent dus alleen vanuit de Child aanroepen. Wijzigingen rechtstreeks doorgevoerd naar de Parent zullen dus niet zichtbaar zijn voor de Child.
 
Tommy Masschelein

Tommy Masschelein

06/09/2007 13:22:00
Quote Anchor link
Ok ik heb het dan als volgt opgelost omdat het project meerdere childs kan bevatten en er maar juist 1 parent moet zijn :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
    class Foo {
        public $Child_Collection = array();
        function
Modify_Collection($Old_Child_Name,$New_Child_Name) {
            unset($this->Child_Collection[$Old_Child_Name]);
            $this->Child_Collection[$New_Child_Name] = TRUE ;
            return TRUE;
        }
        function
Create_Child($Child_Name) {
            $Child_Instance = new Bar($Child_Name,$this);
            $this->Child_Collection[ $Child_Name] = TRUE;
            return $Child_Instance;
        }
    }

    
    class Bar extends Foo {
        public $Name = '';
        
        function
__construct($Child_name,&$parent) {
            $this->Name = $Child_name;
            $this->_parent = $parent;
        }
        function
Rename($New_Name) {
            if ($this->_parent->Modify_Collection($this->Name,$New_Name)) {
                $this->Name = $New_Name;
            }
        }
    }

?>


met dank aan peter ;-)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.