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
[ 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
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.
Wat vriendelijker kan ook welTombo_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.
[ Voor 77% gewijzigd door AtleX op 13-04-2005 18:21 ]
Sole survivor of the Chicxulub asteroid impact.
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
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
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 excusesTombo_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.
@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
GOTO bestaat ook in aardig wat talen, en overal wordt het gebruik afgeradenmbravenboer schreef op woensdag 13 april 2005 @ 18:08 iets over scopes enzo
Sorry, glad verkeerd gelezenTombo_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
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.
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
Kan je dan niet een function parameter meegeven?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 wetenik 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.
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.
$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 ]
Maar php is geen functionele taalmbravenboer 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.
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...
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 ?> |
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: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 ...
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.
De "geneste" functie komt zelfs in de normale globale functie-scope...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!
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.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.
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
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.
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

Proud member of TCF - D2OL is zooooo 2005
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
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
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
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
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