2009-06-08 9 views
1

En réponse à une autre question sur les expressions régulières, on m'a demandé d'utiliser la fonction preg_replace_callback (PHP regex templating - find all occurrences of {{var}}) comme solution à mon problème. Cela fonctionne très bien, mais maintenant j'ai une question relative à la portée variable dans les fonctions de rappel.Portée variable pour les fonctions de rappel PHP

La fonction qui analyse le texte fait partie d'une classe, mais les données que je souhaite utiliser sont stockées localement dans la fonction. Cependant, j'ai constaté que je ne peux pas accéder à ces données à l'intérieur de ma fonction de rappel. Voici les moyens que je l'ai essayé jusqu'à présent:

  • Mettre en oeuvre le rappel en fonction de la classe privée, en passant '$this->callback_function' comme paramètre de rappel (ne fonctionne pas, php a une erreur fatale)
  • Mettre en oeuvre le rappel à l'intérieur de la fonction qui l'utilise (voir exemple ci-dessous), mais cela ne fonctionne pas, soit parce que $newData n'est pas portée à l'intérieur callback_function

des idées quant à la façon dont je peux accéder à $newData dans ma fonction de rappel, de préférence sans utiliser globals ?
Merci beaucoup.

Exemple ci-dessous pour la deuxième tentative (ne formate pas correctement lorsque je l'ai mis après le point de balle)

public function parseText($newData) { 
    ... 
    function callback_function($matches) { 
    ... //something that uses $newData here 
    } 
    ... 
    preg_replace_callback('...', 'callback_function', $textToReplace); 
} 

Répondre

2
  • Mettre en oeuvre le rappel en fonction de la classe privée, en passant '$ this-> callback' comme paramètre de rappel (ne fonctionne pas, php a une erreur fatale)

preg_replace_callback ('...', 'callback_function', $ textToReplace);

Changer votre appel à être preg_replace_callback ('...', array($this, 'callback_function'), $textToReplace); en callback_function est une méthode privée dans votre classe.

<?php 

class PregMatchTest 
{ 

    private callback_function ($matches) 
    { 
     // ...... 
    } 

    public function parseText ($newData) 
    { 
     // .... 

     preg_replace_callback('...', array($this, 'callback_function'), $textToReplace); 
    } 

} 

?> 
+0

Hey, merci, c'est exactement ce que je recherchais. –

-2

Je ne pense pas qu'il soit possible sans utiliser globals, peut-être situé juste sur la $ _GLOBALS tableau et puis mettez-le à si vous le souhaitez.

Questions connexes