2010-03-11 4 views
1

Je dois passer la route $ à sa fonction intérieure, mais a échoué:Comment passer des paramètres dynamiquement en PHP?

function compilePath($route) 
{ 
    preg_replace('$:([a-z]+)$i', 'pathOption' , $route['path']); 
    function pathOption($matches) 
    { 
     global $route;//fail to get the $route 
    } 
} 

J'utilise PHP5.3, il est une caractéristique qui peut aider?

+0

Pouvez-vous déclarer des fonctions à l'intérieur des fonctions? Est-ce que PHP supporte les fonctions anonymes? –

+0

@Anthony Ceci est un code PHP parfaitement valide. Cependant, la plupart des gens ne déclarent pas réellement les fonctions dans les fonctions. –

+0

Je vais deviner que vous êtes un programmeur javascript – tzenes

Répondre

5

Je ne pense pas que vous puissiez faire quelque chose comme ça dans PHP 5.2, malheureusement - mais comme vous utilisez PHP 5.3 ... vous pouvez utiliser des fermetures pour que cela fonctionne.


Pour commencer, voici un exemple rapide d'utilisation d'une fermeture:

function foo() 
{ 
    $l = "xyz"; 
    $bar = function() use ($l) 
    { 
     var_dump($l); 
    }; 
    $bar(); 
} 
foo(); 

afficherons:

string 'xyz' (length=3) 

Notez que le mot-clé use ;-)


Et est ici un exemple de comment vous pourriez utiliser cela dans votre cas spécifique:

function compilePath($route) 
{ 
    preg_replace_callback('$:([a-z]+)$i', function ($matches) use ($route) { 
     var_dump($matches, $route); 
    } , $route['path']); 
} 

$data = array('path' => 'test:blah'); 
compilePath($data); 

Et vous obtiendrez cette sortie:

array 
    0 => string ':blah' (length=5) 
    1 => string 'blah' (length=4) 

array 
    'path' => string 'test:blah' (length=9) 

Quelques notes:

  • je preg_replace_callback, et non preg_replace - comme je veux une fonction de rappel pour être appelé.
  • J'utilise un anonymous function comme rappel
  • Et cette fonction anonyme importe $route, avec le nouveau mot-clé use.
    • Ce qui signifie que, dans ma fonction de rappel, je peux accéder à la fois les matchs, qui sont toujours passés par preg_replace_callback à la fonction de rappel, et la $route.
1

tout mettre dans une classe, y compris le rappel et grab route $ en utilisant $ this-> itinéraire au lieu d'utiliser globals. Vous devriez utiliser preg_replace_callback(). Pour utiliser un rappel d'une classe, utilisez Array ($ class, 'callback') ou Array ('className', 'callback).

Questions connexes