2010-08-20 6 views
1

J'écris un système de gestion de contenu. L'administrateur de la page saisit le contenu d'une page et, lorsqu'il saisit un nombre entouré de caractères spéciaux, il est remplacé par une entrée de base de données sur l'écran du visualiseur lorsqu'il est analysé. Pour accomplir cela dans l'analyse, j'utilise preg_replace_callback(). Cependant, je ne peux pas passer ma variable de connexion à la base de données dans la fonction de rappel, cela ne fonctionnera donc pas. Comme solution de contournement à court terme, j'essaie simplement de faire de la connexion à la base de données une variable globale dans cette instance et de l'utiliser comme ça, mais ce n'est rien d'autre qu'un slutty kludge et pas une bonne idée à long terme.Passage de plusieurs arguments à une fonction de rappel (avec PHP 5.2)

Est-ce que quelqu'un sait comment résoudre mon problème ou même une façon différente de faire ce que j'essaie de faire?

Répondre

3

Vous devez créer une fonction/méthode qui l'enveloppe.

class PregCallbackWrap { 
    private $dbcon; 
    function __construct($dbcon) { $this->dbcon = $dbcon; } 
    function callback(array $matches) { 
     /* implementation of your callback here. You can use $this->dbcon */ 
    } 
} 
$dbcon = /* ... */ 
preg_replace_callback('/PATTERN/', 
    array(new PregCallbackWrap($dbcon), 'callback'), $subject,); 

En PHP 5.3, vous pouvez simplement faire:

$dbcon = /* ... */ 
preg_replace_callback('/PATTERN/', 
    function (array $matches) use ($dbcon) { 
     /* implementation here */ 
    }, 
    $subject 
); 
+0

Pourriez-vous utiliser 'create_function()'? –

+0

@Peter Je considère que c'est une abomination ... créer une fonction à partir d'une chaîne ... C'est le cousin 'eval'. Et cela ne résoudrait pas le problème car il ne peut pas créer une fonction liée à des variables externes. Nous sommes de retour à 'global'. – Artefacto

+0

@Artefacto - 'create_function()' prend les arguments fwiw - 'chaîne create_function (chaîne $ args, chaîne $ code)'. Je comprends le point sur 'eval'. –

0

Dans le rappel, vous pourriez appeler une fonction qui renvoie la connexion de base de données? Par exemple un singleton class qui a la connexion à la base de données.

0

réponse de Artefacto est correcte (et devrait être accepté par l'OP), mais pour tous ceux qui cherchent une solution plus générique, vous pouvez vous référer à this question on SE

Questions connexes