2016-03-31 6 views
0

Im folgenden Code habe ich Schwierigkeiten, einen Weg zu finden, auf die Objektreferenzvariable $ this innerhalb der Callback-Funktion 'cb' zuzugreifen. Ich erhalte die Fehler

Fatal error: Using $this when not in object context

Ich möchte in der Lage sein, die Methode zu nennen ‚fett‘ innerhalb der Funktion ‚cb‘.

<?php 
    class Parser 
    { 
     private function bold($text) 
     { 
      return '<b>' . $text . '</b>'; 
     } 

     // Transform some BBCode text containing tags '[bold]' and '[/bold]' into HTML 
     public function transform($text) 
     { 
       function cb($matches) 
       { 
        // $this not valid here 
        return $this->bold($matches[1]); 
       }   

       $html = preg_replace_callback('/\[bold\]([\w\x20]*)\[\/bold\]/', 'cb', $text); 
       return $html;  
     }   
    } 

    $t = "This is some test text with [bold]BBCode tags[/bold]"; 

    $obj = new Parser(); 

    echo $obj->transform($t) . "\n"; 
    ?> 
+0

Verwenden Sie self :: fett statt $ this-> fett –

+0

Sie wissen in PHP - _named Funktionen können nie geschachtelt werden! _ Der Parser wirft keinen Fehler wegen anonymer Funktionen. Stattdessen extrahiert es es und legt es in den globalen Raum. ;// Es stellt es nicht als eine Methode der Klasse dar; -/imo, _never verschachtelte benannte Funktionen/Methoden in PHP._ imo, Es endet normalerweise in Verwirrung für den Programmierer. Mach es einfach zu einer Methode in der Klasse? –

+0

@JorgeMejia getestet - erzeugt einen ähnlichen Fehler: 'Fataler Fehler: Kann nicht auf self zugreifen :: wenn kein Klassenbereich aktiv ist. Aber @ fusion3k 's Lösung funktioniert – tcdaly

Antwort

1

Sie haben einen variablen Umfang Ausgabe: innerhalb cb Funktion keine externe Variable/Objekt/etc sichtbar ist.

Ihre Funktion Klassenmethode ändern:

class Parser 
{ 
    (...) 
    private function cb($matches) 
    { 
     return $this->bold($matches[1]); 
    }   
    (...) 
} 

Und dann preg_replace_callback auf diese Weise ändern:

$html = preg_replace_callback('/\[bold\]([\w\x20]*)\[\/bold\]/', array($this, 'cb'), $text); 
#                 ==================== 

Als Alternative (auf PHP> = 5.4) eine anonyme Funktion verwenden können:

$html = preg_replace_callback 
(
    '/\[bold\]([\w\x20]*)\[\/bold\]/', 
    function($matches) 
    { 
     return $this->bold($matches[1]); 
    }, 
    $text 
); 
+0

Danke, das funktioniert. Habe ich recht, wenn ich denke, dass der Effekt von 'array ($ this, 'cb')' darin besteht, '$ this' in die Methode' cb' als lokale Variable zu injizieren? Wenn ja, warum muss man dann die Funktion 'cb' verschieben, um sie zu einer Klassenmethode zu machen? – tcdaly

+0

'array ($ this, 'cb')' 'injiziert $' this nicht in 'cb'; Es ist der Weg, eine Objektmethode anstelle einer Funktion aufzurufen. Es bedeutet '(Objekt, Methode)'. – fusion3k

0

würde dies für Sie arbeiten?

public function transform($text) 
{ 
    $html = preg_replace_callback('/\[bold\]([\w\x20]*)\[\/bold\]/', array($this, 'bold'), $text); 
    return $html;  
} 

Sie können ein bisschen mehr Logik in die Funktion verschieben müssen bold, weil es eine Reihe von Übereinstimmungen in diesem Fall erhalten.

+0

Danke. Ich muss eigentlich die Funktionen "cb" und "bold" getrennt halten, weil ich an anderer Stelle auch "fett" nennen muss (in meiner eigentlichen Anwendung macht die Funktion "fett" hier etwas Komplexeres). – tcdaly