[OOP] Schrijven in variabele van andere classe

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wim Mari

Wim Mari

14/06/2007 17:17:00
Quote Anchor link
Hallo iedereen,

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)
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
<?php
class A
{
   var
$output = NULL;
   var
$object = NULL;

   function
__construct()
   {

      $this->object = new B;
      $this->output = "output";
   }
}


class B extends A
{
   function
addoutput($txt)
   {

      $this->output .= $txt;
   }
}


$a = new A;
$a->object->addoutput('text');
echo $a->output; // output: output
?>


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?
 
PHP hulp

PHP hulp

14/05/2024 21:52:17
 
Hipska BE

Hipska BE

14/06/2007 17:21:00
Quote Anchor link
je doet het verkeerd!
zo moet het:
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
<?php
class A
{
   var
$output = NULL;

   function
__construct()
   {

      $this->output = "output";
   }
}


class B extends A
{
   function
addoutput($txt)
   {

      $this->output .= $txt;
   }
}


$a = new B();
$a->addoutput('text');
echo $a->output; // output: output
?>
 
Jan geen

Jan geen

14/06/2007 17:23:00
Quote Anchor link
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????
 
Wim Mari

Wim Mari

14/06/2007 17:31:00
Quote Anchor link
omdat ik ervaring wil met objecten binnen objecten.

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
 
Jelmer -

Jelmer -

14/06/2007 17:50:00
Quote Anchor link
$this is inderdaad aan zijn context gebonden, en die context kan je niet even inwisselen voor een andere (zoals wel mogelijk is in Javascript)

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)
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
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!
?>


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)
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
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'.
?>
 
Wim Mari

Wim Mari

14/06/2007 18:24:00
Quote Anchor link
Bedankt Jelmer, het eerste werkt! (het 2de heb ik niet getest)
 



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.