[PHP] string naar functie converten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Hallo,

Ik zit met een probleem wat ik niet op php.net / google kan vinden.
Ik wil graag een string uit een array bijv
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$unit= Array("marine", "ghost", "firebat", "dryad")

foreach($unit as $legal)
{
     if(in_array("dryad", $unit))
       $this->$legal($remove)

}

function dryad($remove)
{

code om array element te schrappen

}


Bovenstaande werkt niet omdat $legal een string is en dus niet achter $this-> gezet kan worden. (toch? ;) )

Het idee is dus, ik werk in een class, dat ik een functie kan aanroepen die hetzelfde is als de waarde van de string die in de array zit.
Want elke waarde in de array stelt een functie in de class voor. En dat kunnen er steeds meer worden.

Weet iemand dit? _/-\o_

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

eval?

dynamisch een method aan een class toevoegen kan gewoonweg niet

[ Voor 88% gewijzigd door crisp op 31-07-2004 01:30 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
de method bestaat wel, maar ik wil hem graag dynamisch aanroepen omdat ik anders een x aantal van de if() statements onder elkaar krijg, wat ik niet wil.

ga even eval bekijken.

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zoolander schreef op 31 juli 2004 @ 01:34:
de method bestaat wel, maar ik wil hem graag dynamisch aanroepen omdat ik anders een x aantal van de if() statements onder elkaar krijg, wat ik niet wil.

ga even eval bekijken.
Een aantal if statements? Jij moet eens opzoeken hoe een switch/case statement werkt. ;) Maar voor dit probleem zou een eval wel moeten voldoen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Daar werk ik wel eens mee, switch. Is wellicht idee.
maar dan zit ik nog steeds met hoe ik die string convert.

heb nog nooit met eval gewerkt.

is dit het dan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$unit= Array("marine", "ghost", "firebat", "dryad")

foreach($unit as $legal)
{
     if(in_array("dryad", $unit))
    {
       eval($legal)
       $this->$legal($remove)

    }

}

function dryad($remove)
{

code om array element te schrappen

}

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 20-09 19:50

Neman

Een uit de lucht gegrepen naam

code:
1
2
eval($legal)
$this->$legal($remove)

moet dit worden:

code:
1
eval("\$this->".$legal."(".$remove.");"); // of: eval("\$this->$legal($remove);");

[ Voor 222% gewijzigd door Neman op 31-07-2004 02:42 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
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
26
<?php
class T
{
    function Call()
    {
        $unit= Array("marine", "ghost", "firebat", "dryad");
        $remove = 12;
        foreach($unit as $legal)
        {
            if($legal == 'dryad')
            {
               $this->$legal($remove);
            }

        }
    }

    function dryad($remove)
    {
        echo 'foo';
    }
}

$T = new T;
$T->Call();
?>

Werkt gewoon :)

Zie ook http://www.php.net/manual...ns.variable-functions.php

[ Voor 34% gewijzigd door PrisonerOfPain op 31-07-2004 09:44 . Reden: $remove wel declareren ]


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Ik zie hier allemaal heel 'vieze' oplossingen met eval() en strings als functions call.
php heeft hier gewoon een functie voor: call_user_func
Wel zo veilig t.o.v. eval() -- ook wel 'evil()' genoemd }) -- en het houdt je code duidelijk. Je ziet wat er gebeurd.

Let met dit soort contructies in classes wel op je referencing! Voor je het weet werk je niet op het object waarvan je denkt dat je ermee werkt, maar met een kopie ervan, en dat kost VEEL debuggen voor dat je het door hebt. Hoewel dit in php5 sterk verbeterd is (van horen zeggen :) )

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class myclass {
  function say_hello() 
  {
   echo ="Hello!\n"; 
  }

  function doSomething($input)
  {
       echo call_user_func(array($this,$input));
  }
}

$foo= new myclass;
$foo->doSomething('say_hello');
?> 

Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
:( grrrr ;)
Soms denk je te weten waar het aan licht, is het niet zo.
$this->$bla geeft idd gewoon $this->waarde van $bla.

opgelost.

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
beetle71 schreef op 31 juli 2004 @ 10:09:
Ik zie hier allemaal heel 'vieze' oplossingen met eval() en strings als functions call.
Wat is er mis met strings als functies? Dat zijn gewoon functie-pointers (http://www.function-pointer.org/ ) op de PHP manier
php heeft hier gewoon een functie voor: call_user_func
Ik vind het juist overbodig om een functie te gebruiken voor iets wat gewoon een taal constructie is. Je zou IMHO call_user_func alleen moeten gebruiken als je nog compatible met PHP3.nogiets wilt zijn..

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
PrisonerOfPain schreef op 31 juli 2004 @ 10:19:
[...]

Wat is er mis met strings als functies? Dat zijn gewoon functie-pointers (http://www.function-pointer.org/ ) op de PHP manier

[...]

Ik vind het juist overbodig om een functie te gebruiken voor iets wat gewoon een taal constructie is. Je zou IMHO call_user_func alleen moeten gebruiken als je nog compatible met PHP3.nogiets wilt zijn..
Ok, ik zal het iets nuanceren ;)
Eval() is Evil() IMHO :) en ik denk dat de meesten dat wel met mij eens zijn.

Het gebruik van een string als functiepointer is inderdaad niet vies in de zin van programmeer technisch. Maar ik (en dat is mijn persoonlijke mening) vind het heel onduidelijk als je dit in code tegenkomt. Bijv.
PHP:
1
2
3
4
5
6
7
<?php
function my_func(){
    echo "Hello";
}
$func="my_func";
$func();
?>

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
beetle71 schreef op 31 juli 2004 @ 11:06:
Het gebruik van een string als functiepointer is inderdaad niet vies in de zin van programmeer technisch. Maar ik (en dat is mijn persoonlijke mening) vind het heel onduidelijk als je dit in code tegenkomt. Bijv.
PHP:
1
2
3
4
5
6
7
<?php
function my_func(){
    echo "Hello";
}
$func="my_func";
$func();
?>
Wat ik me dan afvraag is waarom hetzelfde idee maar dan met call_user_func() wel duidelijk zou zijn?
PHP:
1
2
3
4
5
6
7
8
<?php
function my_func()
{
    echo "Hello";
}
$func="my_func"; //Als je er doorheen moet loopen is het ook een var, vandaar
call_user_func ($func);
?>

Ik zie het verschil niet zo, 't zal wel een kwestie van smaak zijn denk ik.

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Zoolander schreef op 31 juli 2004 @ 10:12:
:( grrrr ;)
Soms denk je te weten waar het aan licht, is het niet zo.
$this->$bla geeft idd gewoon $this->waarde van $bla.

opgelost.
maar $this->$bla() zoekt weer een functie met de contents van de string $bla.

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
PrisonerOfPain schreef op 31 juli 2004 @ 11:12:
[...]

Ik zie het verschil niet zo, 't zal wel een kwestie van smaak zijn denk ik.
Inderdaad een kwestie van smaak, Maar ik heb wel eens code gedebugged van een andere programmeur die PER ONGELUK een $ teveel had staan...

[/php]
$template->$clip();
[php]

En daar kijk je eerst overheen en vervolgens moet je gaan uitzoeken wat de bedoeling was. Met een call_user_func hoef je dat niet, omdat het dan meteen duidelijk is wat de programmeur bedoelde. Vooral als zowel $clip geset is als de functie die door de waarde daarvan bepaald wordt....

Natuurlijk, het is een kwestie van smaak (en smaken verschillen ;) ), en als je nette en goed gedocumenteerde code voor je neus krijgt ook geen enkel probleem.

I rest my case :P
Pagina: 1