[PHP] Argumentlists en references, hoe?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Ik heb gezocht op internet en op GOT maar ik kan het niet vinden.
Ik heb een functie die een dynamisch aantal parameters meekrijgt.
Een x tal daarvan wil ik meegeven als reference zodat de variabele in de functie wordt gewijzigd.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
  function test()
  {
    $aantalParams = func_num_args();

    for($i = 0; $i < $aantalParams; $i++)
    {
      $param = func_get_arg($i);
      $param = $param * 10;
    }
  }

  $a = 10;

  test(&$a);

  echo $a;
?>


Resultaat is 10.
Maar ik zou eigenlijk willen dat dit 100 was.

Ik heb wel ontdekt dat in $GLOBALS[] tijdens het uitvoeren van functie test() er nu een element is
bijgekomen genaamd "a".
Kennelijk worden de parameters dus geregistreerd als GLOBAL.

Oplossing is elementen in $GLOBALS[] wijzigen. Echter, ik weet de naam van de variabele niet.
Weet iemand hoe ik achter de naam van de dynamisch meegegeven parameters kan komen? ($GLOBALS["a"] = $GLOBALS["a"] * 10)

[ Voor 5% gewijzigd door Verwijderd op 03-01-2006 13:31 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik heb geen idee of dit gaat werken, maar sowieso zou ik dan nog even goed naar het stukje binnen je for lus kijken aangezien je hier ook allemaal toewijzingen doet. Dat het niet werkt komt waarschijnlijk doordat de func_get_arg byValue gaat en door je vermenigvuldiging.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

func_get_arg(s) geeft alleen copies, geen references. Je kunt het lelijk doen met die GLOBALS, maar dan lijkt het me netter om gewoon een array mee te geven met de argumenten.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het klopt inderdaad dat het by value wordt geretourneerd. Anders had ik dit probleem niet :)

Is er in PHP geen functie die vertelt hoe de variabelen heten? Dus een soort func_get_args() maar dan met variabel namen? Ik heb al gezocht op php.net maar hier wordt nergens over gerept. Reflection class biedt helaas ook geen uitkomst...

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat kan niet, je hoeft immers niet per se variabelen mee te geven aan functies.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

wat is het probleem als je references in een Array propt? Volgens mij moet dat toch ook werken?

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Overigens vraag ik me wel af of je oplossing uberhaupt wel handig is als je denkt een functie nodig te hebben met een variabel aantal argumenten, waar je ook nog eens pass-by-value en pass-by-reference gaat mengen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Of het handig is moet ieder voor zich weten toch ;) ?

Ik heb hier een 'vieze' oplossing:

PHP:
1
2
3
4
5
6
7
8
9
10
11
function test($arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null)
{
  for($i = 0; $i < 5; $i++)
  {
    ${arg.$i} = 10;
  }
}

$a = 20;
test(10, &$a);
echo $a;

Resultaat is 10. Wellicht niet de mooiste oplossing :)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Wel eens een array gezien?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ff on-topic blijven moddie? ;)
Weet iemand hoe ik achter de naam van de dynamisch meegegeven parameters kan komen?

[ Voor 79% gewijzigd door Verwijderd op 04-01-2006 10:45 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom wil je geen array gebruiken dan? Lijkt me niet zo off-topic.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Het meegeven van de naam was een poging van de ts om zijn probleem op te lossen. Een hele lelijke en gedeeltelijk onwerkbare oplossing daarbij.

Een array _is_ ontopic, want het is de enige fatsoenlijke oplossing in deze situatie.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 04 januari 2006 @ 10:48:
[...]


Waarom wil je geen array gebruiken dan? Lijkt me niet zo off-topic.
Omdat het voor RPC server/client wrapper is en probeer daarbij de client-kant bijna hetzelfde te laten lijken :) (voor zover dat mogelijk is). Voorbeeldje:

Server:
PHP:
1
2
3
4
function testFunctie($a, $b, &$c)
{
  ...
}


Client:
PHP:
1
$oServer->doFunction("testFunctie", 10, 20, &$test);


Uiteraard kan een array ook
PHP:
1
$oServer->doFunction("testFunctie", array(10, 20, &$test));

Maar liever niet dus :)

[ Voor 22% gewijzigd door Verwijderd op 04-01-2006 11:38 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom zou je die functies die aan de serverkant bestaan niet gewoon zo exposen naar de client toe? Dus $oServer->testFunctie(...) ipv $oServer->doFunction("testFunctie", ...)

[ Voor 3% gewijzigd door .oisyn op 04-01-2006 11:49 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Heb je al wel eens gekeken naar xmlrpc? Voorloper van dat microsoft-ding, en erg eenvoudig in gebruik :)

Dit is natuurlijk een wild-guess over wat je met RPC zou bedoelen, en meer als hint bedoeld dat je vaak standaardoplossingen kan gebruiken voor problemen

[ Voor 38% gewijzigd door MBV op 04-01-2006 13:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sterker nog: het is een XMLRPC wrapper :)
.oisyn schreef op woensdag 04 januari 2006 @ 11:48:
Waarom zou je die functies die aan de serverkant bestaan niet gewoon zo exposen naar de client toe? Dus $oServer->testFunctie(...) ipv $oServer->doFunction("testFunctie", ...)
Nadeel is dat als je aan je project aan het werken bent je dan steeds die functiedefinities in de class, server en de client moet aanpassen. Kans op het maken van fouten is helaas wel hoger doordat de definities niet bij de client kant bekend zijn :'(

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, daar heb je natuurlijk generators voor he :). Weet niet of die bestaan voor php overigens, maar volgens mij is het wel mogelijk om op te vragen welke methods een class heeft, en dus kun je een scriptje maken die de client-side classdefinitie genereert aan de hand van de daadwerkelijke classdefinitie aan de server-side.

Bovendien is de kans op fouten er nu niet minder op, aangezien je zelf de string mee moet geven en er wat php betreft al geen mogelijkheid bestaat om te controleren dat die "testFunctie" die je aanroept aan de server-side kant weldegelijk bestaat.

[ Voor 28% gewijzigd door .oisyn op 05-01-2006 12:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
In de documentatie staat dat func_get_args() kopieën teruggeeft, maar er staat hierover niets bij func_get_arg(). Kleine kans, maar misschien dat
PHP:
1
$arg =& func_get_arg($n);

werken gaat?

[edit]
Het is trouwens deprecated om argumenten by reference door te geven aan functie-calls. In plaats daarvan moet je in de functie defintie opgeven dat het by reference is. Dus
PHP:
1
2
$result = foo($a, &$b); // fout
$result = foo($a, $b); // goed
, hier hoort dus de functie:
PHP:
1
function foo($a, &$b) { }
bij.

[ Voor 46% gewijzigd door Skaah op 06-01-2006 12:26 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Weer sterker nog ;) mijn collega heeft al een dergelijke XMLRPCBuilder gebouwd (welliswaar nog beta nu) en staat op sourceforge. Het is alleen erg verveld om tijdens het ontwikkelen (als functies en arguments veranderlijk zijn) steeds de generator er overheen te laten lopen.

Dat van die references: klopt helemaal. Alleen we hebben hier nog wat code draaien waar we eigenlijk van af willen blijven en die wel references gebruiken :s

Laatste suggestie ga ik ff proberen. Was ik nog niet opgekomen :)
Pagina: 1