[php] probleem met variabelen in geneste functie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
beste mensen,

ik heb een functie met daarin een paar andere functies. nu heb ik echter een probleem met het aanspreken van bepaalde variabelen. mijn structuur is als volgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$woei = "hallee";

function groot() {
$blaat = "uhuh";
    function klein() {
        global $blaat,$woei;
        echo($blaat); // dit werkt niet
        echo($woei); // dit werkt wel
                        // $blaat heb ik nodig in deze functie
    }

          function klein2() {
          //andere meuk
         }
}

ik weet niet hoe ik dit op moet lossen. ik hoop dat jullie me kunnen helpen.

[ Voor 10% gewijzigd door tombo_inc op 13-04-2005 17:17 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Wat is het nut van een functie binnen een andere functie? Doe dat gewoon niet dan ben je waarschijnlijk ook wel van dit probleem af. :)

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
ik heb dit in mijn geval gewoon nodig. dus als je een oplossing weet dan moet je het zeggen en anders niet.
Modbreak:Iets aardiger mag ook wel. Brakkie probeert je alleen te helpen; zijn suggestie lost inderdaad gewoon je probleem op. Als dit voor jou niet voldoet, dan kun je ook gewoon zeggen waarom niet; sterker nog, dat hoort in je startpost thuis.

[ Voor 54% gewijzigd door NMe op 13-04-2005 17:49 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Je zit met scopes, groot() kan uit de bovenliggende scope variabelen halen met global, maar de bovenliggende scope van klein() is groot() die kan dus nooit bij de variabele $woei.

Globals zijn eigenlijk best vies, ze zorgen ervoor dat je code niet kan hergebruiken en verminderen de duidelijkheid over afkomst van variabelen. Je kan beter functie parameters gebruiken, die zijn daar tenslotte voor gemaakt.

Ook nested functions zijn in 99% van de gevallen totaal overbodig, je kan beter eens kijken naar de logische opbouw van je code om dit soort constructies te omzeilen.
Tombo_inc schreef op woensdag 13 april 2005 @ 17:41:
ik heb dit in mijn geval gewoon nodig. dus als je een oplossing weet dan moet je het zeggen en anders niet.
Wat vriendelijker kan ook wel :|

[ Voor 77% gewijzigd door AtleX op 13-04-2005 18:21 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Daarnaast: Je kan vaak ook prima gebruik maken van parameters en return values. Mocht je met return values niet uitkomen (stel dat je 2 variabelen wilt "returnen" uit een functie) dan kan je ook nog eens kijken naar references.

Het gebruik van globale variabelen hiervoor is vaak niet de mooiste oplossing. Het kan zelfs verwarrend gaan werken omdat je niet meer precies weet welke variabele nu waar wordt aangepast.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Merkwaardige reacties hier :o . Allereerst gaat het helemaal niet om globale variabelen: de topicstarter wil een variabele uit een omringende functie gebruiken in een geneste functie. Hier is helemaal niets mis en het is zelfs een stijl die wordt aangemoedigd in veel andere (functionele) talen.

Jullie raden de topicstarter aan om een taal feature niet te gebruiken omdat deze niet nodig is. Waarom bestaat de taal feature dan eigenlijk? Moeten geneste functies dan maar gewoon uit PHP gehaald worden? Als een taal geneste functies support, verwacht je ook dat je die normaal mag gebruiken ...

Het echte probleem is echter dat de hele taal feature brak geimplementeerd is. Normaal gesproken hebben geneste functies in een taal lexical scope, wat betekent dat ze de variabelen van de functies waarin ze zich bevinden kunnen gebruiken. Dit verwacht de topicstarter dus ook, en terecht!

De taal feature moet dus inderdaad maar weg, maar niet omdat het concept van geneste functies zinloos is. Geneste functies in PHP zijn gewoon niet goed geimplementeerd.

Zie ook: (even zoeken op nested functions)
http://c2.com/cgi/wiki?PhpProsAndCons

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
Tombo_inc schreef op woensdag 13 april 2005 @ 17:41:
ik heb dit in mijn geval gewoon nodig. dus als je een oplossing weet dan moet je het zeggen en anders niet.
Modbreak:Iets aardiger mag ook wel. Brakkie probeert je alleen te helpen; zijn suggestie lost inderdaad gewoon je probleem op. Als dit voor jou niet voldoet, dan kun je ook gewoon zeggen waarom niet; sterker nog, dat hoort in je startpost thuis.
ja srry maar ik zit al de hele dag aan dit probleem te rotzooien en het werkt niet. daarom ben ik een beetje geirriteerd en dan zit je niet op zulke reacties te wachten. ik weet zelf ook wel dat ik het op die manier op kan lossen maar dan werkt mijn programma niet meer. ik zou natuurlijk geen dingen gaan vragen als ik ze ook niet nodig heb. nogmaals mijn excuses

@atlex.
ik kan juist wel bij $woei (zit twee lagen erboven) en niet bij $blaat die er maar een laag erboven zit

[ Voor 7% gewijzigd door tombo_inc op 13-04-2005 18:21 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

GOTO bestaat ook in aardig wat talen, en overal wordt het gebruik afgeraden ;). Verder is mijn stukje over scopes exact gelijk en jou stukje over lexical scopes. klein() kan niet buiten de scope van groot() en kan dus niet bij $woei :)
Tombo_inc schreef op woensdag 13 april 2005 @ 18:19:
[...]

@atlex.
ik kan juist wel bij $woei (zit twee lagen erboven) en niet bij $blaat die er maar een laag erboven zit
Sorry, glad verkeerd gelezen :(

Kijk eens met error_reporting(E_ALL) of dat iets zinnigs oplevert?

[ Voor 57% gewijzigd door AtleX op 13-04-2005 18:25 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
heb ik al, er zijn geen fouten. hij doet het gewoon niet. maar wat dus het doel is uiteindelijk voor de mensen die het willen weten :p ik wil dus waardes hebben in de parent functie die ik kan gebruiken in de child functies, zonder dat ik ze steeds apart op moet gaan halen in een child.

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Tombo_inc schreef op woensdag 13 april 2005 @ 18:30:
heb ik al, er zijn geen fouten. hij doet het gewoon niet. maar wat dus het doel is uiteindelijk voor de mensen die het willen weten :p ik wil dus waardes hebben in de parent functie die ik kan gebruiken in de child functies, zonder dat ik ze steeds apart op moet gaan halen in een child.
Kan je dan niet een function parameter meegeven?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$woei = "hallee";

function groot() {
$blaat = "uhuh";
    function klein($param1) {
        echo($param1); // dit werkt niet
    }

          function klein2() {
          //andere meuk
         }
}
?>

[ Voor 3% gewijzigd door AtleX op 13-04-2005 18:34 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Wanneer je een functie binnen een andere functie definieert valt de nieuw gedefinieerde functie niet binnen de locale scope van de functie waarbinnen hij gedefinieerd is maar in de globale scope.

$blaat is alleen bekend binnen de functie waarbinnen hij gedefineerd is en valt dus niet onder de globale scope.

Deze info heb ik trouwens uit de comments van php.net

[ Voor 4% gewijzigd door Brakkie op 13-04-2005 18:39 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

mbravenboer schreef op woensdag 13 april 2005 @ 18:08:
Allereerst gaat het helemaal niet om globale variabelen: de topicstarter wil een variabele uit een omringende functie gebruiken in een geneste functie. Hier is helemaal niets mis en het is zelfs een stijl die wordt aangemoedigd in veel andere (functionele) talen.
Maar php is geen functionele taal ;)
In php wordt normaliter een stel parameters aan de functie-aanroep meegegeven alvorens verder te werken. De functie is overigens niet genest, alleen het aanmaken van de functie gebeurt pas bij de eerste aanroep van de buitenste functie.
Bij een tweede call naar de buitenste functie zul je een error krijgen die je verteld dat de functie al bestaat, en je kan ook de binnenste functies na de aanroep buiten je functie gebruiken...
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
<?
        function outer()
        {
                function inner()
                {}
        }

        outer();
        outer();
?>
Fatal error: Cannot redeclare inner() (previously declared in /home/acm/temp/functies.php:6) in
 /home/acm/temp/functies.php on line 4

<?
        function outer()
        {
                function inner()
                {
                        echo "inner";
                }
        }

        outer();
        inner(); // inner komt op het scherm
?>
Jullie raden de topicstarter aan om een taal feature niet te gebruiken omdat deze niet nodig is. Waarom bestaat de taal feature dan eigenlijk? Moeten geneste functies dan maar gewoon uit PHP gehaald worden? Als een taal geneste functies support, verwacht je ook dat je die normaal mag gebruiken ...
Zoals dus gezegd, het is slechts een definitie die pas uitgevoerd wordt na de aanroep van de buitenste functie. Het heeft wel wat van de enorm wazige scoping van php met o.a. for-loops en if's enzo:
PHP:
1
2
3
4
5
6
7
8
9
if(true)
{
   $a = 1;
}

echo $a; // echo'd 1
for($i = 0; $i < 10; $i++)
{}
echo $i; // echo'd 10

In php mag dat.
Het echte probleem is echter dat de hele taal feature brak geimplementeerd is. Normaal gesproken hebben geneste functies in een taal lexical scope, wat betekent dat ze de variabelen van de functies waarin ze zich bevinden kunnen gebruiken. Dit verwacht de topicstarter dus ook, en terecht!
De "geneste" functie komt zelfs in de normale globale functie-scope...
De taal feature moet dus inderdaad maar weg, maar niet omdat het concept van geneste functies zinloos is. Geneste functies in PHP zijn gewoon niet goed geimplementeerd.
Ach juist doordat het overal al zo los mee is, kan de functionaliteit op zich best nuttig zijn. Waar je bij andere omgevingen via Reflection functionaliteit dynamisch kan toevoegen kan je in php dmv de definitie van functies in andere functies evt nog wat leuks doen. Je zou het onder de noemer "registreren van functies" kunnen gooien ofzo.

Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
ja dat is idd een interessant verhaal maar nou weet ik nog steeds niet hoe ik het oplos :p(zonder dan argumenten mee te geven)

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Niet. Als je goed gelezen had had je dat ook kunnen weten nu.

Dit is gewoon niet mogelijk met php's brakke scoping en hoewel de definitie van je binnenste functie in een andere zit, wordt hij gewoon als een normale functie met een eigen scope opgebouwd. Het enige wat de ene met de andere functie heeft te maken is de plaats en het tijdstip van declaratie, meer niet!

Wat jij wil lijkt me prima met functie-parameters en eventueel object georienteerd werken te doen.

Acties:
  • 0 Henk 'm!

  • Huppie
  • Registratie: Mei 2003
  • Laatst online: 02-09 09:59
Je zou het altijd op kunnen lossen door $blaat ook te globaliseren?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$woei = "hallee";

function groot() {
$blaat = "uhuh";
$GLOBALS['blaat'] = $blaat;
    function klein() {
        global $blaat,$woei;
        echo($blaat); // dit werkt niet
        echo($woei); // dit werkt wel
                        // $blaat heb ik nodig in deze functie
    }

          function klein2() {
          //andere meuk
         }
}

groot();
klein();
?>


Dat is wel compleet ranzig hoor imo :X

Proud member of TCF - D2OL is zooooo 2005


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
ja idd dat zou kunnen, maar ik denk dat ik dan toch maar voor de parameter methode ga. en ik zit al in een object te werken eigenlijk. want die parent functie is een object methode waarin ik een ander bestand include. in dat bestand zitten de (child) functies.

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Wat is eigenlijk de reden dat je in eerste instantie af zou willen zien van een parameter?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
dat past niet in mijn structuur. de functies spugen alleen code uit en worden gewoon aangeroepen. de waardes die ik in deze functies nodig heb zijn config waardes. die kan ik dan allemaal los uit de db halen in iedere functie maar ik kan ze ook 1x uit de db halen en dan de array met config waardes global maken zodat ze in iedere functie beschikbaar zijn. ik kan nu die waardes ook wel via argumenten meegeven, maar dat leek mee niet zo handig. maar ik zal nu dus wel moeten, of ik moet in iedere functie de configs los ophalen maar dat kost me weer onnodige serverload en extra code regels. dus ik denk dat de parameter methode het beste is.

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Met configuratievariabelen (constanten, eigenlijk) kun je ze het beste gewoon (altijd) global maken, dan zou ik er ook niet zo gauw voor kiezen om ze als parameter mee te geven.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 04-02-2022
ja dat was ook mijn bedoeling maar dat gaat in dit geval dus niet (op een nette manier). (ik haal de configs uit de db)

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition

Pagina: 1