[PHP] functie uit andere class uitvoeren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb de volgende 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
<?

class A
{
    function fA()
    {
        print $this->waarde;
    }

    function A($waarde)
    {
        $this->waarde = $waarde;
    }
}

class B
{
    function fB()
    {
        $a = new A('test'); // dit wil ik dus niet
        $a->fA();
    }
}

$a = new A('test');
$b = new B();

$b->fB();

?>


wat ik dus wil is in class B een functie uitvoeren uit class A die variabelen bevat uit die class A

ik wil dat echter doen zonder zoals in bovenstaande code staat de class A opnieuw in te laden, voor mijn code doe ik dat immers al aan het begin van het script, dat betekent weer extra laadtijd, en daarnaast brengt het in mijn script ook nog andere problemen met zich mee

in de search kan ik niet echt iets vinden, misschien omdat ik mijn probleem niet duidelijk kan definieren ...

bovenstaande code is teruggebracht tot het uiterste minimum om de essentie van het probleem duidelijk weer te geven

[ Voor 10% gewijzigd door Verwijderd op 15-02-2004 00:23 ]


Acties:
  • 0 Henk 'm!

  • Terranca
  • Registratie: April 2000
  • Laatst online: 18-09 18:25
Je hebt denkik 2 (misschien nog andere, maar deze twee zijn de handigste denkik) opties: De classe A meegeven aan classe B, of classe A meegeven aan fB(). Dit kan je dan uiteraard "by-reference" doen, waardoor er niet een nieuwe classe aangemaakt hoeft te worden.

Even een paar snippets:
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
// Class A meegeven aan Class B
class A {
    var $vars;

    function fA ()
    {
        print $this->vars;
    }
}

class B {
    var $_Object_A;
    var $andere_vars;

    function B ( &$Object )
    {
        $this->_Object_A = &Object;
    }

    function fB ()
    {
        $this->_Object_A->fA();
    }
}

of
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Class A meegeven aan functie fB()
class A {
    var $vars;

    function fA ()
    {
        print $this->vars;
    }
}

class B {
    var $andere_vars;

    function B ( )
    {
    }

    function fB ( &$Object )
    {
        $Object->fA();
    }
}


Hoop dat het duidelijk is dat de eerste optie handig is als veel functies van die classe gebruik maken, en de tweede als dat slechts 1 of 2 functies zijn. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok ...

kun je me een beetje uitleggen hoe die class B precies in elkaar steekt ? begrijp het niet echt namelijk (eerste optie), wat die & tekens betekenen bijvoorbeeld, zal wel iets met dat 'by-reference' te maken hebben ?

[edit]

ik heb het idee wel door geloof ik :)
maar hoe roep ik dit precies aan nu ? hoe geef die ene functie het object (dat is de class A toch ?) mee ...

zo ?

PHP:
1
2
3
4
$a = new A ('test');
$b = new B($a);

$b->fB();

[ Voor 37% gewijzigd door Verwijderd op 15-02-2004 01:03 ]


Acties:
  • 0 Henk 'm!

  • Terranca
  • Registratie: April 2000
  • Laatst online: 18-09 18:25
Het & teken betekent dat hij ipv een kopie van het object, het adres naar het huidige object meegeeft. Dit heet 'by-reference' en zorgt ervoor dat bewerkingen die je binnen de functie fB() op het meegegeven object, ook BUITEN die functie inlvloed hebben. Bij classes uiteraard vaak essentieel aangezien je waarschijnlijk eigenschappen van het meegegeven object wil aanpassen, en niet de eigenschappen van een (tijdelijke) kopie.

Meer daarover kan je hier in de PHP Manual lezen.

[reactie op edit]
Jepz, dat moet werken :) (in combinatie met de 1e optie dus)

[ Voor 9% gewijzigd door Terranca op 15-02-2004 01:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
was een beetje laat met mijn edit, ik snap het idee nu geloof ik (dat is toch pas als je iets van jezelf werkend hebt, bij mij iig)

maar hoe roep ik in jouw code het geheel nu aan, zodat een door mij gedefinieerde variabele ook iets output ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
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
<?

class A
{
    function A($vars)
    {
        $this->vars = $vars;
    }

    function fA()
    {
        print $this->vars;
    }
}

class B
{
    function B(&$Object)
    {
        $this->_Object_A = $Object;
    }

    function fB()
    {
        $this->_Object_A->fA();
    }
}

$a = new A('test');
$b = new B($a);

$b->fB();

?>


zo dit werkt _/-\o_
het is me nu te laat om dit in mijn hele code in te bouwen, maar iig bedankt voor de snelle reactie, ik probeer het morgen nog te implementeren :)

Acties:
  • 0 Henk 'm!

  • Terranca
  • Registratie: April 2000
  • Laatst online: 18-09 18:25
Graag gedaan :)

Nog een klein beetje commentaar op je classes (ook al zijn deze fictief): Het is erg verstandig voor het overzicht en de volledigheid van je code om al de member-variabelen van je classes bovenaan de class te definieren mbv 'var $variabele', zoals je ook ziet in mijn voorbeeldjes. Vreemd genoeg geeft PHP geen error als je dit niet doet, maja ... :)

Acties:
  • 0 Henk 'm!

Verwijderd

Maar als je dat niet doet dan worden de variabelen toch gewoon niet meegenomen naar de volgende functie's? of zie ik dat nou verkeerd? Evengoed vind ik dit wel verdomt handig om te weten.

Trouwens als je een grote functie lijst hebt kan je misschien met extend ze bij elkaar voegen?

class a extends b {
function a() {

}
}

ofzo. (dit vind ikzelf altijd wel handig) Dan worden alle functies in b gecopieerd naar a. (het is geen verwijzing ofzo.. of hoe je het ook uitlegt :P )

Acties:
  • 0 Henk 'm!

  • Terranca
  • Registratie: April 2000
  • Laatst online: 18-09 18:25
Dat heet dan weer inheritance, en is bedoeld om meerdere 'extended' classes te ontwerpen van 1 'basis' class. Het is dus eigenlijk niet bedoeld om grote classes mee in 2en te delen.

En wat betreft die variabelen. Zodra jij een variabele met $this->var aanroept (dit worden de members of membervariabelen genoemd), is dit een variabele die voortaan voor elke functie uit die class aanroepbaar is en zal dus NIET worden verwijdert wanneer je functie afgelopen is.

Ik zou als ik jou was eens een tutorial zoeken over OOP in PHP (het programmeren met classes) en over de werking van functies en variabelen (ook veel over te vinden in de PHP Manual).

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Als je je class alleen als verzamelbank gebruikt, in plaats van als object, kun je ook

classnaam::fucntienaam(args); gebruiken. Je kunt dan in je functies geen $this gebruiken.

[ Voor 16% gewijzigd door Skaah op 15-02-2004 12:09 ]

Pagina: 1