[OOP] Parent - Child - Object Collections
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)
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
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;
}
}
}
?>
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 />';
?>
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 ::
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.
Code (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
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;
}
}
}
?>
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 ;-)