[PHP] Scope lokale var

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 20-09 21:39

Kaastosti

Vrolijkheid alom!

Topicstarter
Ik ben nog niet helemaal thuis in het systeem van klassen en objecten, maar volgens mij zou dit gewoon moeten werken. Ik gebruik de $this->var constructie en wil die vervolgens, zonder het als argument mee te geven, ook gebruiken binnen een andere functie. Dit is wat ik bedoel:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Test
{
    function functie()
    {
        function subfunc1()
        {
            $array = Array("value");
            return $array;
        }

        function subfunc2()
        {
            echo "array: ";
            print_r($this->array);
        }
    $this->array = subfunc1();
    subfunc2();
    }
}

Volgens mij zou de scope van $this->array over de hele functie() moeten vallen en dus bekend moeten zijn binnen subfunc2(), of mis ik nu wat? Ook het bijvoorbeeld alvast aanmaken van $this->array in de constructor van de klasse werkt hier niet. Ik vond het juist zo mooi dat ik een var aan kon maken die binnen die hele functie gebruikt kan worden in verscheidene sub-functies :) Waar zit de denkfout?

[ Voor 13% gewijzigd door Kaastosti op 18-03-2005 16:14 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Onder PHP4 levert het een 'undefined variable this' op, onder PHP5 ging het met dezelfde code om een andere reden niet. Namelijk dat subfunc2 niet statisch is. (Daar gaat de aanroep dus al fout..)

Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 20-09 21:39

Kaastosti

Vrolijkheid alom!

Topicstarter
Onder PHP4 levert het een 'undefined variable this' op
LOL ja als je bovenstaande code direct copy/paste wel ja... wat is "maak $array" :)
Dat stukje even aangepast, nu werkt ook c&p wel.

In m'n eigen code klopt dat uiteraard allemaal wel en krijg ik helemaal geen errors of warnings terug (en ja, die staan aan). Ik draai PHP 4.3.10, zoals die bij de installatie van debian met apt-get geleverd wordt.

[ Voor 11% gewijzigd door Kaastosti op 18-03-2005 16:13 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
functies binnen functies? dat dat ueberhaupt mag!!

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
class Test
{
    var $array;
    
    function subfunc1()
    {
        return array();
    }

    function subfunc2()
    {
        print_r($this->array);
    }
        
    function functie()
    {
        $this->array = $this->subfunc1();
        $this->subfunc2();
    }
}
?>

[ Voor 5% gewijzigd door Genoil op 18-03-2005 16:14 ]


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 20-09 21:39

Kaastosti

Vrolijkheid alom!

Topicstarter
Ja, want die functies worden alleen daar gebruikt. Ik vond het juist wel prettig dat die functies pas beschikbaar worden als de 'parent'-functie is uitgevoerd.

De rest van m'n classes zijn ook op de gebruikelijke manier opgebouwd en daar werkt alles wel volgens plan. Ik dacht dan ook dat het op deze manier ook wel zou werken... helaas dus.

Het idee van de functie-in-functie is dat de parent-functie uitgevoerd wordt, dan de twee child-functies aanmaakt, vervolgens een stukje code uitvoerd waarin wat variabelen worden opgehaald, die vervolgens door de child-functies worden gegooid. Op die manier kan de parent-functie 1 variabele returnen waarop alles is uitgevoerd.

[ Voor 74% gewijzigd door Kaastosti op 18-03-2005 16:18 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Kaastosti schreef op vrijdag 18 maart 2005 @ 16:12:
[...]

LOL ja als je bovenstaande code direct copy/paste wel ja... wat is "maak $array" :)
Dat stukje even aangepast, nu werkt ook c&p wel.
Nee, met de volgende code ook:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
error_reporting(E_ALL);
class Z
{
    var $X = 'q';

    function X()
    {
        function Q()
        {
            print_r($this->X);
        }
        Q();
        //$this->Q(); //gaat ook fout
    }
}

$Z = new Z();
$Z->X();
?>

[ Voor 7% gewijzigd door PrisonerOfPain op 18-03-2005 16:23 ]


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 20-09 21:39

Kaastosti

Vrolijkheid alom!

Topicstarter
M'kay dat systeem gaat dus gewoon niet goed werken jammergenoeg. Dan maar netjes functies niet met elkaar mixxen, uiteindelijk werkt het toch wel :)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Kaastosti schreef op vrijdag 18 maart 2005 @ 16:15:
Ja, want die functies worden alleen daar gebruikt. Ik vond het juist wel prettig dat die functies pas beschikbaar worden als de 'parent'-functie is uitgevoerd.
Wat is er prettig aan? Normaalgesproken doet men dat soort dingen in OOP met data-hiding (private/protected), maar dat heb je alleen in PHP5.
De rest van m'n classes zijn ook op de gebruikelijke manier opgebouwd en daar werkt alles wel volgens plan. Ik dacht dan ook dat het op deze manier ook wel zou werken... helaas dus.
Ik heb er al moeite mee dat het mag, die functies in functies. Maarja aangezien je dus je scope op $this al kwijtraakt is de onhandigheid ervan imo al genoeg aangetoond. Jammer dat je al je classes zo hebt opgebouwd, ik zou ze echt om gaan bouwen als ik jou was...
Het idee van de functie-in-functie is dat de parent-functie uitgevoerd wordt, dan de twee child-functies aanmaakt, vervolgens een stukje code uitvoerd waarin wat variabelen worden opgehaald, die vervolgens door de child-functies worden gegooid. Op die manier kan de parent-functie 1 variabele returnen waarop alles is uitgevoerd.
ehm..juistem...dat kan met losse functies toch ook?

Acties:
  • 0 Henk 'm!

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Zo zie je maar weer: globale(re) variabelen zijn zelden ergens goed voor. In principe ben ik het dan ook met Genoil eens; sterker nog: dit klinkt als iets dat beter met een aparte class opgelost kan worden.

Mocht je volharden in deze imo vrij ondoorzichtige functie-layout, gebruik dan parameters; daar zijn die dingen voor verzonnen. "Ja, maar dan moet al die data de stack op en dat is traag!" Antwoord: pass 'em by reference:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
error_reporting(E_ALL);
class Test
{
    var $array = Array("non-value");

    function functie()
    {
        function subfunc1($blaat)
        {
            $blaat = Array("value");
        }

        subfunc1(&$this->array); // <-- let op de & !
    }
}

$tst = new Test();
print_r($tst->array);
$tst->functie();
print_r($tst->array);


Journalism is printing what someone else does not want printed; everything else is public relations.


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Rataplan schreef op vrijdag 18 maart 2005 @ 17:08:
Mocht je volharden in deze imo vrij ondoorzichtige functie-layout, gebruik dan parameters; daar zijn die dingen voor verzonnen. "Ja, maar dan moet al die data de stack op en dat is traag!" Antwoord: pass 'em by reference:
maar dan net even anders, want "Call-time pass-by-reference has been deprecated"

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
error_reporting(E_ALL);
class Test
{
    var $array = Array("non-value");

    function functie()
    {
        function subfunc1(& $blaat) // <-- hierrr de &
        {
            $blaat = Array("value");
        }

        subfunc1($this->array); // <-- hierrr mag ni meer!
    }
}

$tst = new Test();
print_r($tst->array);
$tst->functie();
print_r($tst->array);
Pagina: 1