Andavos: preg_replace_callback an Class Funktion übergeben

Hallo,
also in einer Class rufe ich per preg_replace_callback() eine andere Funktion in der gleichen Class auf.

Dies habe ich so gelöst:
$this->vars = preg_replace_callback("/($ausdurck)/si", array($this,'funktion'), $this->vars);

Die Funktion sieht so aus
class Name
{
//...

function funktion($werte,$ausgabe=1,$speichern=1)
  {
  //....
  return 0;
  }

//...
}

Jetzt würde bei einem Aufruf der Funktion gerne die Optional Werte $ausgabe und $speichern ändern.
Ist dies möglich und wenn ja, wie muss dass dann bei pre_replace_callback aussehen?

MFG
Andavos

  1. Hi!

    function funktion($werte,$ausgabe=1,$speichern=1)
      {
      //....
      return 0;
      }

    Jetzt würde bei einem Aufruf der Funktion gerne die Optional Werte $ausgabe und $speichern ändern.
    Ist dies möglich und wenn ja, wie muss dass dann bei pre_replace_callback aussehen?

    Was spricht gegen eine Wrapper-Funktion, die "funktion" mit entsprechenden Parametern aufruft?

    Grüße
    Andreas

    --
    SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
  2. echo $begrueszung;

    Arbeitest du mit PHP4 oder mit PHP5? Der Unterschied liegt in der Art der Parameterübergabe bei Objekten. PHP4 übergibt eine Kopie, PHP5 eine Referenz.
    Da du deine PHP-Version nicht angegeben hast, nehme ich an, dass du PHP4 verwendest.

    $this->vars = preg_replace_callback("/($ausdurck)/si", array($this,'funktion'), $this->vars);

    Mit PHP4 solltest du eine Referenz auf die aktuelle Instanz ( &$this ) bei der Callback-Übergabe angeben [1], damit die Methode der aktuellen Instanz aufgerufen wird, und damit darin auch die Eigenschaften der aktuellen Instanz verwendbar sind.

    function funktion($werte,$ausgabe=1,$speichern=1)

    Die Übergabe der beiden Extra-Parameter hat keinen Wert wenn sie von preg_replace_callback() aus aufgerufen wird. Wenn du extra Werte festhalten willst, solltest du das in Instanz-Eigenschaften (oder globalen Variablen) tun.

    echo "$verabschiedung $name";

    [1] Hier schimpft auch ein ausgeschaltetes allow_call_time_pass_reference nicht.

    1. Hallo,

      Mit PHP4 solltest du eine Referenz auf die aktuelle Instanz ( &$this ) bei der Callback-Übergabe angeben [1]

      Hab das Problem jetzt anders gelöst.

      Aber wie sieht denn eine Renferenz-Übergabe in einer Class aus?

      P.S. Der Script soll sowohl PHP4 (am besten >=4.0.5) als auf PHP5 kompatibel sein.
      Aber das muss ich nochmal testen, bisher ist PHP4.3.10 als Version zum entwickeln benutzt worden.

      MFG
      Andavos

      1. echo $begrueszung;

        Mit PHP4 solltest du eine Referenz auf die aktuelle Instanz ( &$this ) bei der Callback-Übergabe angeben [1]
        Aber wie sieht denn eine Renferenz-Übergabe in einer Class aus?

        Indem du statt $this eben &$this angibst. Für ein Callback gibt man eine Methode dann eben so an:
        array(&$this, 'methodeName')

        Hier noch mal alle Varianten, callbacks anzugeben:

        'functionName'
        array('className', 'methodName') // Aufruf einer statischen Klassen-Methode
        array($this, 'methodName') // Kopie der aktuellen Instanz
        array(&$this, 'methodName') // aktuelle Instanz

        Beim Umstieg auf PHP5 ist bei Verwendung von Klassen mindestens die Referenz-Problematik zu beachten.

        Wenn man in PHP4 sich keine Gedanken gemacht hat, was bei $var = $anObject; passiert, und Referenzen &$anObject nur dann verwendet hat, wenn es gar nicht anders ging (siehe oben), dann wird man höchstwahrscheinlich keine Probleme bekommen.

        Wenn man jedoch bewusst $aCopy = $anObject; verwendet hat, um beim Verarbeiten von $aCopy die Eigenschaften von $anObject unverändert zu lassen, muss man beim Wechsel aufpassen und ein clone dazwischenschieben.

        echo "$verabschiedung $name";