Klasses linken lukt niet goed

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mitchel

mitchel

16/06/2009 12:02:00
Quote Anchor link
Het is een slecht voorbeeld maar het geeft een beetje weer wat ik precies wil doen. Ik wil dus uit klasse b naar klasse a iets sturen en vanuit functie c naar functie d iets sturen en dan komt er dus een foutmelding.

Fatal error: Call to undefined method a::d()

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
    {
        public function c($msg) {
            // hier wil ik een bericht doorsturen naar class a function d
            $var = $msg . "2e berichtje erbij";
            $this->d($var);
        }

        
        public function d($msg) {
            // hier doe ik dan wat met het bericht
        }
    }


    class b
    {
        public function e($msg) {
            // hier wil ik een bericht doorsturen naar class a function c
            a::c($msg)
        }
    }

    

?>
 
PHP hulp

PHP hulp

23/12/2024 07:15:34
 
Joren de Wit

Joren de Wit

16/06/2009 12:15:00
Quote Anchor link
Als je vanuit e() de method a::c() op die manier aanroept, zal $this verwijzen naar klasse b. Met andere woorden, naar b::d() die niet bestaat. Dan zou je er in a::c() ook voor moeten kiezen om een statische verwijzing naar a::d() te maken, maar dan gooi je het hele idee van OO programmeren eigenlijk overboord.

In wat voor toepassing wil je dit plaatsen, want de gedachte achter dit voorbeeld is in ieder geval niet correct. Als je in b bepaalde methods van a wilt gebruiken, maak dan een instantie van a aan en ga daarmee aan de slag. Dus iets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
public function e($msg) {
  $a = new a;
  $a->c($msg);
}

?>
 
Kumkwat Trender

Kumkwat Trender

16/06/2009 12:23:00
Quote Anchor link
Je code zou zo wel moeten werken trouwens:

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 a {
    public function c($msg) {
        // hier wil ik een bericht doorsturen naar class a function d
        if(!empty($msg)) {
            $this->var    = $msg;
        }
else {
            $this->var    = 'leeg waarde';
        }

        $this->d($this->var);
    }

        
        public function d($msg) {
        // hier doe ik dan wat met het bericht
        return 'bericht: '.$msg;
        }
    }


    class b extends a {
        public function e($msg) {
        // hier wil ik een bericht doorsturen naar class a function c
        parent::c($msg);
        }
    }


$ff = new b();
echo $ff->c('');
echo $ff->e('bericht2');
?>

Is niet getest, dus er kunnen fouten inzitten..

Edit:

Blanches voorbeeld is toch wat beter :P:

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 function c($msg) {
        // hier wil ik een bericht doorsturen naar class a function d
        if(!empty($msg)) {
            $this->var    = $msg;
        }
else {
            $this->var    = 'leeg waarde';
        }

        $this->d($this->var);
    }

        
        public function d($msg) {
        // hier doe ik dan wat met het bericht
         return 'bericht: '.$msg;
        }
    }


    class b {
        public function e($msg) {
        // hier wil ik een bericht doorsturen naar class a function c
        $a = new a;
        $a->c($msg);
    }
}


$ff = new b();
echo $ff->e('');
echo $ff->e('bericht2');
?>
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
 
Mitchel

mitchel

16/06/2009 12:24:00
Quote Anchor link
Ik heb nu dus een database klasse die ik ook in een andere klasse wil gebruiken en ik wilde precies weten hoe ik dit dus goed kon doen.


edit: en die 2e klasse is een user klasse en die mag je volgens OOP niet extenden met database klasse zo ver ik heb gelezen en gezien.
Gewijzigd op 01/01/1970 01:00:00 door mitchel
 
The Force

The Force

16/06/2009 12:25:00
Quote Anchor link
Als je de functie c($msg) uit de klasse a via de klasse b aanroept, refereert "$this" naar klasse b. Stel je zou een functie d($msg) in klasse b zetten dan zie je dat die wordt aangeroepen.

Hoe kan je dit oplossen? Door in functie c "$this->d($var)" te vervangen door "self::d($var)". Nu roept hij functie d uit klasse a aan!

Succes :)
 
Joren de Wit

Joren de Wit

16/06/2009 12:27:00
Quote Anchor link
mitchel schreef op 16.06.2009 12:24:
Ik heb nu dus een database klasse die ik ook in een andere klasse wil gebruiken en ik wilde precies weten hoe ik dit dus goed kon doen.
Dan gebruik je dus een instantie van je database klasse in je user klasse en niet andersom.

@Peter: extenden mag alleen als je kunt zeggen 'b is een a', dus bijvoorbeeld 'kerk is een gebouw'. In alle andere gevallen kun je een klasse niet extenden...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 

16/06/2009 12:30:00
Quote Anchor link
Peter schreef op 16.06.2009 12:23:
Je code zou zo wel moeten werken trouwens:

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 {
    var
$var;
    public function c($msg) {
        // hier wil ik een bericht doorsturen naar class a function d
        if(!empty($msg)) {
            $this->var    = $msg;
        }
else {
            $this->var    = 'leeg waarde';
        }

        $this->d($this->var);
    }

        
        public function d($msg) {
        // hier doe ik dan wat met het bericht
        echo 'bericht: '.$msg.'<br>';
        }
    }


    class b extends a {
        public function e($msg) {
        // hier wil ik een bericht doorsturen naar class a function c
        parent::c($msg);
        }
    }


$ff = new b();
echo $ff->c('');
echo $ff->e('bericht2');
?>

Is niet getest, dus er kunnen fouten inzitten..

Misschien een beetje offtopic, maar wel belangrijk vind ik.
In een class function doe je geen echo, daar doe je een return, je wilt met de waarde kunnen werken. Misschien wil je er wel sprintf o.i.d. over gooien. Verder gebruik je var, dat komt van php4. Php 4 heeft in vergelijking met php 5 slechte OOP ondersteuning.
 
Kumkwat Trender

Kumkwat Trender

16/06/2009 12:33:00
Quote Anchor link
Karl is weer wakker zo te zien :)
ik zal je tips onthouden
 
Mitchel

mitchel

16/06/2009 12:37:00
Quote Anchor link
Blanche schreef op 16.06.2009 12:27:
mitchel schreef op 16.06.2009 12:24:
Ik heb nu dus een database klasse die ik ook in een andere klasse wil gebruiken en ik wilde precies weten hoe ik dit dus goed kon doen.
Dan gebruik je dus een instantie van je database klasse in je user klasse en niet andersom.

@Peter: extenden mag alleen als je kunt zeggen 'b is een a', dus bijvoorbeeld 'kerk is een gebouw'. In alle andere gevallen kun je een klasse niet extenden...
Dus het is nodig om eerst aan te duiden a = new a(); voordat ik de functie kan gebruiken of snap ik het nu helemaal verkeerd
 
Joren de Wit

Joren de Wit

16/06/2009 12:46:00
Quote Anchor link
Ja. Die database klasse verzorgt de verbinding met jouw database. Als jij in een bepaalde andere klasse een database verbinding nodig hebt, maak je dus een instantie van je database klasse aan waarmee je vervolgens kunt werken.

Er zijn uiteraard ook andere alternatieven waarbij je bijvoorbeeld vooraf een instantie van de databaseklasse aanmaakt en die in een Registry bewaart. Maar het komt er altijd op neer dat je een instantie van die klasse gebruikt en nooit op een statische manier functies uit die klasse aanroept. De instantie van jouw database klasse representeert immers de verbinding met jouw database.
 
Mitchel

mitchel

16/06/2009 13:31:00
Quote Anchor link
Blanche schreef op 16.06.2009 12:46:
Ja. Die database klasse verzorgt de verbinding met jouw database. Als jij in een bepaalde andere klasse een database verbinding nodig hebt, maak je dus een instantie van je database klasse aan waarmee je vervolgens kunt werken.

Er zijn uiteraard ook andere alternatieven waarbij je bijvoorbeeld vooraf een instantie van de databaseklasse aanmaakt en die in een Registry bewaart. Maar het komt er altijd op neer dat je een instantie van die klasse gebruikt en nooit op een statische manier functies uit die klasse aanroept. De instantie van jouw database klasse representeert immers de verbinding met jouw database.
Ok, heel erg bedankt ik ga hier even mee verder.
 



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.