Toon posts:

[php] functie -> variable args, passed by ref

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey, ik wil een functie maken die een variabel aantal argumenten neemt ( <- is geen probleem) maar die argumenten moeten ook nog eens 'passed by reference' (kan zo gauw niet een mooie vertaling verzinnen) zijn, net zoiets als de unset functie dus.

ik heb namelijk geen zin om een functie te maken die standaard 100 argumenten heeft als: &$arg1='',&$arg2='' etc. Is zoiets mogelijk? Of moet ik gewoon 100 keer dezelfde functie gaan opschrijven? :(

Verwijderd

Topicstarter
/me had hier geen slimme dingen staan

Verwijderd

Topicstarter
Waarom ben ik ook altijd zo kortzichtig en kort door de bocht? Natuurlijk werkt het weer niet, tsja als je dingen niet goed test komen daar natuurlijk problemen van, mijn vraag blijft dus zoals hij aanvankelijk was.
anyone :?

Verwijderd

Topicstarter
Niemand dus, owkee, ik zal voor het nageslacht ff posten wat ik gebruikt heb als oplossing, is niet bepaald mooi, maar goed:
code:
1
2
3
4
5
6
7
function addHallo()
{   $args=func_get_args();
    foreach($args as $arg)
    {   global ${$arg};
        ${$arg}.="hallo";
    }
}

Als argumenten geef ik aan de functie niet de variabelen, maar de namen van de variabelen mee, wat dus wel een aardig nadeel is.
Overigens voegt deze nutteloze functie het woord hallo aan alle variabelen toe.

  • Grum
  • Registratie: Juni 2001
  • Niet online
coole solo thread .. mag ik vragen waarvoor je het nodig hebt ?

Het is denkik wel te doen maar dat vertel ik liever niet behalve als et ECHT niet anders kan aangezien de method enorm ranzig zal zijn ;)

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Kan je niet een array maken en die by reference doorgeven?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13-09 15:13
Op donderdag 28 februari 2002 00:19 schreef Orphix het volgende:
Kan je niet een array maken en die by reference doorgeven?
Goede suggestie, lijkt me. Je hoeft dan natuurlijk niet je array by reference, maar enkel een array met references door te geven.

  • Grum
  • Registratie: Juni 2001
  • Niet online
Je moet natuurlijk niet denken dat php dat kan he :P

Het zou me ECHT verbazen als je daarmee weg zou komen aangezien PHP onder elke straatsteen copieen maakt :\

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13-09 15:13
Misschien ten overvloede, maar ik heb het even geprobeerd en een array met references werkt op zich wel goed:
PHP:
1
<?function lowerAll($args){    for($i=0;$i<sizeof($args);$i++)        $args[$i]=strtolower($args[$i]);}$a="BLA"; $b="die"; $c="Bla";lowerAll(array(&amp;$a,&amp;$b,&amp;$c));print "$a $b $c\n";?>

Helaas werkt de 'mooiere' methode met foreach niet. Blijkbaar wordt dan intern wel een kopie gemaakt.

  • Grum
  • Registratie: Juni 2001
  • Niet online
in php 4.1.1 wel .. daar kan je ook de refs eruit trekken

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13-09 15:13
Op donderdag 28 februari 2002 19:12 schreef Grum_ het volgende:
in php 4.1.1 wel .. daar kan je ook de refs eruit trekken
Hoe dan? =)

  • Grum
  • Registratie: Juni 2001
  • Niet online
hmmmmm
dat moet erin zitten (vind ik >:) ) zat nl wel in 4.0.7cvs ;)

er is ooit iets geweest als:
PHP:
1
<?foreach ( $theZut as &amp;$refKey => &amp;$refValue )   ;?>

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
PHP:
1
<?foreach ($args as &amp;$key => &amp;$value){    //........}?>

al eens geprobeerd? geen idee of het werkt, maar dat zou ik proberen.

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Op donderdag 28 februari 2002 19:09 schreef Soultaker het volgende:
Misschien ten overvloede, maar ik heb het even geprobeerd en een array met references werkt op zich wel goed:
PHP:
1
<?function lowerAll($args){    for($i=0;$i<sizeof($args);$i++)        $args[$i]=strtolower($args[$i]);}$a="BLA";$b="die";$c="Bla";lowerAll(array(&amp;$a, &amp;$b, &amp;$c));print "$a $b $c\n";?>

Helaas werkt de 'mooiere' methode met foreach niet. Blijkbaar wordt dan intern wel een kopie gemaakt.
Hij is bijna goed.... Combineer deze met de kennis dat bij een foreach ($arr as $key => $val) $val als kopie gemaakt wordt, maar niets je weerhoudt om de $arr[$key] te gebruiken. Dan krijg je dus deze:
PHP:
1
<?function lowerAll($args){    foreach ($args as $key => $val)    {        $args[$key] = strtolower($val);    }}$a="BLA";$b="die";$c="Bla";lowerAll(array(&amp;$a, &amp;$b, &amp;$c));print "$a $b $c\n";?>

The box said 'requires Windows 95 or better', so I installed Linux...


Verwijderd

Topicstarter
Op donderdag 28 februari 2002 21:37 schreef TheMrH het volgende:

[..]

Hij is bijna goed.... Combineer deze met de kennis dat bij een foreach ($arr as $key => $val) $val als kopie gemaakt wordt, maar niets je weerhoudt om de $arr[$key] te gebruiken. Dan krijg je dus deze:
PHP:
1
<?function lowerAll($args){    foreach ($args as $key => $val)    {        $args[$key] = strtolower($val);    }}$a="BLA";$b="die";$c="Bla";lowerAll(array(&amp;amp;$a, &amp;amp;$b, &amp;amp;$c));print "$a $b $c\n";?>
Nu is hij nog bijnaer goed, maar moet er nog een & voor $args, anders heb je alsnog een kopie van de hele array waarmee je werkt.
dus:
PHP:
1
<?function lowerAll(&amp;$args)...?>

Het is idd een ander methode, iets minder ranzig, maar zeker niet gemakkelijker. Het zou toch gewoon moeten kunnen.... toch?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13-09 15:13
edit:

Iemand enig idee waarom in mijn code die array niet bij reference gepasst hoeft te worden en in de code TheMrH wel? 't Is niet echt logisch namelijk, in beide gevallen zou dat ding gekopieerd moeten worden, inclusief waarden.

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
Op vrijdag 01 maart 2002 02:18 schreef Soultaker het volgende:
edit:

Iemand enig idee waarom in mijn code die array niet bij reference gepasst hoeft te worden en in de code TheMrH wel? 't Is niet echt logisch namelijk, in beide gevallen zou dat ding gekopieerd moeten worden, inclusief waarden.
Dat komt misschien omdat php sinds 4.0.0 soms ook wel eens bedenkt dat iets niet gekopieerd hoeft te worden. Hierdoor werken scripts een heel stuk sneller. Op zich echter zou ie automatisch gekopieerd moeten worden wanneer je iets wijzigd in de nieuwe var.

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Op vrijdag 01 maart 2002 00:00 schreef Takkie het volgende:
Nu is hij nog bijnaer goed, maar moet er nog een & voor $args, anders heb je alsnog een kopie van de hele array waarmee je werkt.
dus:
PHP:
1
<?function lowerAll(&amp;amp;$args)...?>

Het is idd een ander methode, iets minder ranzig, maar zeker niet gemakkelijker. Het zou toch gewoon moeten kunnen.... toch?
Bij mij werkt deze iig niet, althans als ik de array vul op voorgaande methode. Dan krijg ik op PHP 4.1.1 de melding:
code:
1
Only variables can be passed by reference

wat logisch is want ik array() is een language construct, en retourneerd dus geen variabele. Als ik die array eerst in een variabele zet gaat het ook niet goed...

The box said 'requires Windows 95 or better', so I installed Linux...


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

TheMrH:
code:
1
Only variables can be passed by reference

wat logisch is want ik array() is een language construct, en retourneerd dus geen variabele. Als ik die array eerst in een variabele zet gaat het ook niet goed...
  • [sup]_______________________[/sup] [url="http://www.php.net/function.array"][b]array ()[/b][/url] [i]Returns an array of the parameters.[/i] [sup]_______________________[/sup]
euh? ;)

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


Verwijderd

Topicstarter
Op vrijdag 01 maart 2002 08:36 schreef TheMrH het volgende:
PHP:
1
<?function lowerAll(&amp;amp;$args)...?>
Als dit geen typo was dan is het niet vreemd dat het niet werkt, aangezien hij dan amp;$args probeert te parsen als een variabele, wat het niet is, het is nl niets ;)
moet natuurlijk zijn:
PHP:
1
<?function lowerAll(&amp;$args)...?>

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Dat was geen typo, dat kwam door Topix....

The box said 'requires Windows 95 or better', so I installed Linux...


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13-09 15:13
Even ter verduidelijking van het verschijnsel waar drm en MrH het over hadden: PHP maakt onderscheid tussen de inhoud (waarde) van een variabele (een stukje geheugen met een bepaalde betekenis dus) en de variabele zelf (een entry in de tabel met variabelen, waarin de naam van de variabele aan de inhoud wordt gekoppeld). Wanneer een variabele by reference doorgegeven wordt, wordt een referentie naar de inhoud meegegeven (in plaats van een kopie van de inhoud).

Wanneer een variabele wordt geconstrueerd met array(...), wordt feitelijk alleen de inhoud geconstrueerd, die vervolgens met een assignment aan een naam gekoppeld kan worden. Wanneer deze inhoud direct (by value) wordt doorgegeven aan een functie, gebeurt er dus precies hetzelfde als wanneer een variabele by reference zou worden meegegeven. Het gedrag is dan ook hetzelfde; dit in tegenstelling tot wat eerder beweert werd.
Pagina: 1