[php][error] cannot redeclare .. previously decl

Pagina: 1
Acties:

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Ik heb een probleem als ik een functie binnen de scope van een andere functie definieer. Op mij windows machine bleek dit een php bug te zijn die in een recentere php versie opgelost was. Ik heb toen een een recentere php versie gedownload en de code werkte goed.

Maar nu zit draai ik dezelfde code op een linux machine met de laatste php versie (4.2.2) en nu doet krijg ik dezelfde fout weer :? Aangezien ik op bugs.php.net nog geen melding van deze fout heb gezien, vraag ik me af of er misschien iets anders fout zit?

De code in kwestie is:
PHP:
1
<?function mysqlQuery($query){    function quoteParameter($param)    {        $param = mysql_escape_string($param);        $param = "'$param'";        return $param;    }        $parameters = func_get_args();    array_shift($parameters);    $preparedQuery = preg_replace('/(\?)/e', 'quoteParameter(array_shift($parameters))', $query);    $qID = mysql_query($preparedQuery);    if (mysql_errno() != 0)        return false;    return $qID;}?>

Maar dat doet eigenlijk niet terzake wat het volgende gaat ook al fout:
PHP:
1
<?function test(){    function f() {}}test(); test();?>

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Grum
  • Registratie: Juni 2001
  • Niet online
eeeeeeeeeeeeeh

een function IN een function ? .. knap .. alleen niet in php afaik ;)

php zal iig de 'scope' niet snappen

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Wat is de nut van een functie binnen een functie te defineren?

* LuCarD is dat alleen nog binnen JS tegen gekomen...

Programmer - an organism that turns coffee into software.


  • Grum
  • Registratie: Juni 2001
  • Niet online
Tis nogal onzinnig imho ... php snapt de scope niet .. DUS define em er dan gewoon buiten ... en daarnaast:

[url="http://php.net/function-exists"]http://php.net/function-exists[/url]

had je zelf ook wel kunnen vinden.

Dus:
1/ declare em binnen de scope van een class
2/ declare em buiten de function
3/ gebruik function_exists

Have fun ;)

[LuCarD: het is 'het nut' en niet 'de nut']

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op vrijdag 26 juli 2002 10:41 schreef Grum het volgende:

[LuCarD: het is 'het nut' en niet 'de nut']
Naast PHP Purist ook nog Taal Purist? Gaat dat wel samen? :7

Programmer - an organism that turns coffee into software.


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Het is juist nuttig om een functie binnen de scope van een andere functie te definieren (of beter: te limiteren). Hierdoor kan je een functie splitsen in deelproblemen (die specifiek voor die functie zijn) en elk van die deelproblemen dus een naam geven. Je verpest dan de globale scope niet met voor de buitenwereld onzinne functies (daar bestaat die functie tenslotte niet). Bovendien kan je binnen verschillende hulpfuncties met dezelfde naam declareren.

Wat heeft overigens function_exists() met dit probleem te maken?

Ik denk overigens dat php de scope wel snapt (gezien de aard van dit probleem - het heb alleen nog niet getest), maar dat kan me eigenlijk niet eens echt schelen...

En ja, mijn (tijdelijke) oplossing is inderdaad door de functie maar los te definieren.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Probeer het dan zo eens....
PHP:
1
<?function test() {   $a=create_function('$a','echo "Lambda function"; return (++$a);');   $b=$a(1);   echo $b;}test();test();?>

Programmer - an organism that turns coffee into software.


  • Grum
  • Registratie: Juni 2001
  • Niet online
Infinitive: Het is juist nuttig om een functie binnen de scope van een andere functie te definieren (of beter: te limiteren). Hierdoor kan je een functie splitsen in deelproblemen (die specifiek voor die functie zijn) en elk van die deelproblemen dus een naam geven. Je verpest dan de globale scope niet met voor de buitenwereld onzinne functies.

Wat heeft overigens function_exists() met dit probleem te maken?


Ok .. hoe moet ik je dit in godsnaam uitleggen ?

[u]PHP snapt de scope NIET[/u]
code:
1
2
3
4
5
6
function test()
{
   function test2() { print "Test2\n"; }
   print "Test\n";
}
test(); test2(); test();

geeft
Test
Test2

Fatal error: Cannot redeclare test2() (previously declared in [file]) in [file] on line 5
DUS als je dan toch iets in deze trant wilt voorzetten dan:

1/ gebruik je function_exists in je functie om te zien of je functie al bestaat en zo niet em te definen (de eerste keer dus alleen)
2/ zet je em gewoon buiten je functie omdat php de scope TOCH niet snapt
3/ als je PERSE wil dat de scope goed blijft kwak je et in een class
4/ gebruik je evt zelfs create_function (leuk gevonden btw :D)

tripple :Z :Z :Z

[edit]Je weet btw wel dat deze structuur maar 1 argument laat 'quoten' he ?

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Probeer het dan zo eens....
PHP:
1
<?function test() {   $a=create_function('$a','echo "Lambda function"; return (++$a);');   $b=$a(1);   echo $b;}test();test();?>
Bedankt voor het idee, maar dat vind ik weer niet iets te ver gaan. Overigens, het begrip lambda function heeft bij mij iets van "anonieme (hulp)functie", terwijl in mijn geval ik juist graag een naam aan de hulpfunctie geef.

Nee maar dat idee van function exists streeft zijn doel voorbij. Een extra idee van een function binnen een function is ook het woord documentatie, maar door overal function exists langs te gaan zetten, verneuk je je code (vandaar dat ik niet precies snapte wat ik met dat function exists aanmoest).

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op vrijdag 26 juli 2002 11:06 schreef Infinitive het volgende:

[..]

Bedankt voor het idee, maar dat vind ik weer niet iets te ver gaan. Overigens, het begrip lambda function heeft bij mij iets van "anonieme (hulp)functie", terwijl in mijn geval ik juist graag een naam aan de hulpfunctie geef.
Klopt het is ook een "anonymous function", maar dat is wat jij wou.

Maar misschien moet je eens gaan denken aan de opmerkingen van Grum?
Of misschien overwegen om classes te gaan bouwen?

Dit zijn de opties die je hebt... doe er wat mee... >:)

"The Power is Yours"

Programmer - an organism that turns coffee into software.


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Ik wil geen workarounds, ik wil nested functions ;)
Dit heeft gewoon gewerkt (beter gezegt, thuis op m'n win pc-tje draait het gewoon [uiteraard error reporting op z'n hoogst]), maar waarom dat nu niet meer het geval is... daarvoor begon ik eigenlijk dit topic.
Maar als deze feature niet meer in php zit: wel, dan gebruik ik dat gewoon niet meer.
"The Power is Yours"
Met php? :D

Ik vond overigens wel een aardig verklaring, maar dat geeft nog niet aan waarom het eerst wel gewerkt heeft:
bugs.php.net: php has no "nested function" feature like you'll find in PASCAL or in gcc if you enable the feature

what happens here is that test2 is registered on execution of test in the global namespace, and when you call test a second time it cannot register test2 again

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Grum
  • Registratie: Juni 2001
  • Niet online
Zou het kunnen komen dat je de functie maar 1x aanriep per gebruik ? :P :D

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Op vrijdag 26 juli 2002 11:45 schreef Grum het volgende:
Zou het kunnen komen dat je de functie maar 1x aanriep per gebruik ? :P :D
Nee... wat dan zou 'ie het nu ook moeten doen >:)
Maar goed, ik wilde dus het concept van nested functions toepassen in m'n php scripts, maar als ik zo verder lees wordt dat niet echt (meer?) ondersteunt met php.
Jammer, wat het is juist een mooie feature... met klassen kan je wel hetzelfde effect gebruiken, maar het idee erachter is weer net iets anders...

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Misschien omdat het binnen php eingelijk totaal geen nut heeft?

Het enige nut dat ik kan bedenken voor nested functions, is in C++ met template functions, waarin je een library function aan wilt roepen die een pointer naar function nodig heeft, verschillende types accepteert, en je het type gelijk wilt stellen aan de template paramameter in de "outer" function. Hoewel je dan meestal een template class gebruikt, zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
class Foo {
public:
    template <class T>
    T* bar(T* ptr) {
        struct Local {
            static T* foobar() {return new T;}
        };
        return Local<T>::foobar();
    }

};

Maar verder... :? je kan toch gewoon een tweede class method maken?

Verwijderd

Het is toch uberhaupt compleet onzinnig om met functions binnen functions te werken?

doe niet zo moeilijk en hou het gewoon simpel. zoiets dus:
PHP:
1
<?function quoteParameter($param){    $param = mysql_escape_string($param);            $param = "'$param'";            return $param;    }function mysqlQuery($query){    $parameters = func_get_args();        array_shift($parameters);        $preparedQuery = preg_replace('/(\?)/e', 'quoteParameter(array_shift($parameters))', $query);        $qID = mysql_query($preparedQuery);        if (mysql_errno() != 0) return false;        return $qID;}?>

Dat zou moeten werken. Alleen nog even een klein vraagje, waarom arrayshift je $paramneters 2 keer? een keer voor de pregreplace en een keer in de pregreplace. Zal wel logisch zijn, maar de logica ontgaat me even.

  • Shagura
  • Registratie: Augustus 2001
  • Laatst online: 21-08 16:57
Op vrijdag 26 juli 2002 10:51 schreef Infinitive het volgende:
Het is juist nuttig om een functie binnen de scope van een andere functie te definieren (of beter: te limiteren). Hierdoor kan je een functie splitsen in deelproblemen (die specifiek voor die functie zijn) en elk van die deelproblemen dus een naam geven. Je verpest dan de globale scope niet met voor de buitenwereld onzinne functies (daar bestaat die functie tenslotte niet). Bovendien kan je binnen verschillende hulpfuncties met dezelfde naam declareren.
Erhm, hier is Object orientated programming (OOP) toch voor bedacht :? :)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik snap eerlijk gezegd nog steeds het nut van deel functies binnen functies niet.

Je wilt functies opsplitsen in deel problemen?
Maar je gaat wel die deelproblemen er binnenin uitwerken?

Wat is dan het nut van de opsplitsing? Sterker nog, dan is er toch nauwelijks opsplitsing???

Daarnaast is het 'dan kan je meerdere functies met de zelfde naam declareren' natuurlijk een raar argument, goede naamgeving is verschrikkelijk belangrijk.

Mocht je dus wel met scopes willen knoeien doe het dan met classes.
Pagina: 1