[OOP] Schrijven in variabele van andere classe
Ik heb 2 classes, bvb classe A en classe B
Klasse A bevat enkele parsefuncties, startfuncties en 2 variabele (welke van belang zijn)
- een variabele met de output in, in het voorbeeld $output
- een variabele met een object in, een andere classe dus
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Nu wil ik eigenlijk via een object (a::object in dit geval) een functie uit B kunnen aanroepen, die in classe A een variabele kan wijzigen.
Hoe kan ik het maken dat dit wel kan?
zo moet het:
Volgens mij is het vrij onlogisch wat je wil... als je vanuit A een functie in B wil aanroepen moet je dit object als instantievariabele opslaan, dat heb je al, hetzelfde moet je in B doen. dan roep je in A een functie aan op object B en die roept weer een functie aan in object A. Waarom roep je niet direct die functie in A aan????
de manier van Hipska wist ik zelf ook, het is ook de meest voor de hand liggende.
De classes waar ik mee bezig ben zijn er ook die nooit gebruikt moeten worden, maar enkel dienen om wat ervaring op te doen.
Dus als iemand het antwoord kent (om via een ander object te gaan) zou het fijn zijn als hij reageerde, hoewel ik vermoed dat het onmogelijk is (er zal wel in geschreven kunnen worden, maar de classe wordt dan 2x aangeroepen vrees ik, zodanig dat er 2 objecten van classe A bestaan (even A1 en A2 genoemd in de komende regels). ik maak een object B aan in A1. Dit object B gebruikt extends A (wat voor A2 zorgt). Aangezien de functie in B aangeroepen wordt, vermoed ik dat die functie in B de waarde in een var van A2 stopt ipv A1. Correct me if I'm wrong
Ik doe dit zelf ook wel eens, (maar dan meestal met optionele functies, meestal een soort van callbacks) maar gebruik dan als het ware een 'delegate':
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
30
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
<?php
class A {
public $object;
public $string; // public, dat is belangrijk, en 'kut'.
public function __construct()
{
$this->object = new B($this); // hier geef ik mijzelf als delegate mee
$this->string = 'Pindakaas';
}
}
class B {
protected $delegate;
public function __construct($delegate)
{
$this->delegate = $delegate;
}
public function addOutput($text)
{
$this->delegate->string .= $text;
}
}
$a = new A();
$a->object->addOutput(' met Hagelslag');
// $a->string is nu 'Pindakaas met Hagelslag'. Lekker!
?>
class A {
public $object;
public $string; // public, dat is belangrijk, en 'kut'.
public function __construct()
{
$this->object = new B($this); // hier geef ik mijzelf als delegate mee
$this->string = 'Pindakaas';
}
}
class B {
protected $delegate;
public function __construct($delegate)
{
$this->delegate = $delegate;
}
public function addOutput($text)
{
$this->delegate->string .= $text;
}
}
$a = new A();
$a->object->addOutput(' met Hagelslag');
// $a->string is nu 'Pindakaas met Hagelslag'. Lekker!
?>
Je zou het ook nog anders kunnen doen bedenk ik mij net, maar dit is een beetje riskant? In ieder geval werken heel public/private e.d. niet meer:
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
30
31
32
33
34
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
<?php
class A {
private $delegate;
public $object;
public $string; // public, dat is belangrijk, en 'kut'.
public function __construct($delegate = null)
{
if(get_class($this) == 'a') {
$this->self = $this;
} else {
$this->self = $delegate;
}
$this->self->object = new B($this); // hier geef ik mijzelf als delegate mee
$this->self->string = 'Pindakaas';
}
}
class B extends A {
public function addOutput($text)
{
$this->self->string .= $text;
}
}
$a = new A();
$a->object->addOutput(' met Hagelslag');
// $a->string is nu 'Pindakaas met Hagelslag'. Lekker!
$b = new B();
$b->addOutput('Het regent');
// $b->string is 'Het regent'.
?>
class A {
private $delegate;
public $object;
public $string; // public, dat is belangrijk, en 'kut'.
public function __construct($delegate = null)
{
if(get_class($this) == 'a') {
$this->self = $this;
} else {
$this->self = $delegate;
}
$this->self->object = new B($this); // hier geef ik mijzelf als delegate mee
$this->self->string = 'Pindakaas';
}
}
class B extends A {
public function addOutput($text)
{
$this->self->string .= $text;
}
}
$a = new A();
$a->object->addOutput(' met Hagelslag');
// $a->string is nu 'Pindakaas met Hagelslag'. Lekker!
$b = new B();
$b->addOutput('Het regent');
// $b->string is 'Het regent'.
?>
Bedankt Jelmer, het eerste werkt! (het 2de heb ik niet getest)