2009-06-08 12 views
1

Als Antwort auf eine andere Frage, die ich über reguläre Ausdrücke fragte, wurde mir gesagt, die preg_replace_callback Funktion (PHP regex templating - find all occurrences of {{var}}) als eine Lösung für mein Problem zu verwenden. Das funktioniert gut, aber jetzt habe ich eine Frage bezüglich des Variablenumfangs in Callback-Funktionen.Variable Bereich für PHP-Callback-Funktionen

Die Funktion, die den Text analysiert, ist Teil einer Klasse, aber die Daten, die ich verwenden möchte, wird lokal in der Funktion gespeichert. Ich habe jedoch festgestellt, dass ich nicht auf diese Daten innerhalb meiner Callback-Funktion zugreifen kann. Hier sind die Möglichkeiten, die ich versucht habe, so weit:

  • Implementieren Sie den Rückruf als eine private Klasse Funktion, vorbei '$this->callback_function' als Callback-Parameter (funktioniert nicht, PHP hat einen fatalen Fehler)
  • den Rückruf Implement innerhalb der Funktion, die es verwendet (siehe Beispiel unten), aber das hat nicht funktioniert entweder, weil $newData in ihrem Umfang nicht ist innerhalb callback_function

Irgendwelche Ideen, wie ich in meiner $newData Callback-Funktion zugreifen kann, vorzugsweise ohne Globals mit ?
Vielen Dank.

Beispiel unten für den zweiten Versuch (nicht richtig formatiert werden, wenn ich es nach dem Aufzählungspunkt setzen)

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

Antwort

2
  • Implementieren Sie den Rückruf als eine private Klasse Funktion, vorbei '$ this-> callback_function' als Callback-Parameter (nicht funktioniert, php einen fatalen Fehler hat)

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

Ihren Anruf ändern preg_replace_callback ('...', array($this, 'callback_function'), $textToReplace); zu sein, während callback_function eine private Methode in Ihrer Klasse.

<?php 

class PregMatchTest 
{ 

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

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

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

} 

?> 
+0

Hey, danke, das ist genau das, wonach ich gesucht habe. –

-2

Ich glaube nicht, es möglich ist, ohne Globals zu verwenden, vielleicht setze nur auf die $ _GLOBALS Array und dann deaktivieren Sie es, wenn Sie es wünschen.