2009-06-22 9 views
15

Mein besonderes Szenario beinhaltet einige Textumwandlung mit regulären Ausdrücken innerhalb einer privaten Methode. Die private Methode ruft preg_replace_callback auf, aber es scheint, dass Callbacks für Objekte öffentlich sein müssen. Daher stehe ich fest, dass ich aus der privaten Welt ausbrechen und Implementierungsdetails offenlegen muss, wenn ich es nicht möchte.Kann ich private Instanzmethoden als Callbacks verwenden?

Kurz zusammengefasst: Kann ich eine Instanzmethode als Callback verwenden, ohne die Kapselung zu verlieren?

Danke.

Antwort

21

Ja, es scheint möglich:

<?php 

//this works 
class a { 
    private function replaceCallback($m) { return 'replaced'; } 

    public function test() { 
     $str = " test test "; 
     $result = preg_replace_callback('/test/', array($this, 'replaceCallback'), $str); 
     echo $result; 
    } 
} 

$a = new a(); 
$a->test(); 


//this doesn't work 
$result = preg_replace_callback('/test/', array(new a(), 'replaceCallback'), ' test test ');  
echo $result; 

So ist es, dass preg_replace_callback() scheint, oder Callback-Mechanismus von PHP ist, sich der Umfang, in dem es hieß.

auf 5.2.8 getestet

+0

Funktion oder Fehler? Es funktioniert mit 5.3rc2/win32. – VolkerK

+2

Whoa, das ist beunruhigend fantastisch, wenn sie den Umfang berücksichtigt haben. Ich werde es akzeptieren, sobald ich es ausprobiert habe. –

+0

Bestätigt am 5.2.9 – jason

1

Können Sie eine separate Hilfsklasse für die Textverarbeitung erstellen und die Callback-Methode innerhalb dieser Klasse erstellen (sie kann dort öffentlich sein)? Sie können einen Verweis auf die ursprüngliche Klasse (Objekt) übergeben, wenn Sie Zugriff auf bestimmte Instanzdaten benötigen.

Die öffentliche Schnittstelle zu Ihrer Hauptklasse bleibt konsistent und sauber, und Sie ziehen es wahrscheinlich gehört nicht ohnehin in bestimmte String-Verarbeitung einer Klasse aus ...

+0

ich diese Methode mag, aber es wäre für die Verwendung von Callbacks aller Code Refactoring ... scheint eine zu große Abhilfe erfordern werden. –

-1

Können Sie nicht geschützt benutzen? Ich müsste wissen, wie die Beziehung dieser beiden Klassen in Beziehung zueinander steht, um klarer zu sein, aber Sie sollten in der Lage sein, die Klasse zu erweitern und die neuen geschützten Methoden, die Sie geerbt haben, zu verwenden, ohne sie öffentlich zu machen.

Hoffe, das hilft!

Prost