2009-06-22 19 views
15

Il mio particolare scenario comporta l'esecuzione di alcune trasformazioni del testo utilizzando espressioni regolari all'interno di un metodo privato. Il metodo privato chiama preg_replace_callback, ma sembra che i callback debbano essere pubblici sugli oggetti, quindi sono bloccato a rompere il mondo privato e ad esporre dettagli di implementazione quando preferirei non farlo.Posso usare i metodi di istanza privati ​​come callback?

Quindi, in poche parole: Posso utilizzare un metodo di istanza come callback senza perdere l'incapsulamento?

Grazie.

risposta

21

Sì, a quanto pare è possibile:

<?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; 

così sembra che preg_replace_callback(), o meccanismo di callback di PHP, è consapevole della portata in cui è stato chiamato.

provata su 5.2.8

+0

caratteristica o bug? funziona con 5.3rc2/win32. – VolkerK

+2

Whoa, è terribilmente impressionante se hanno preso in considerazione l'ambito. Accetterò una volta che lo proverò. –

+0

Confermato in 5.2.9 – jason

1

È possibile creare una classe di helper separata per l'elaborazione del testo e creare il metodo di callback all'interno di quella classe (può essere pubblico lì)? È possibile passare un riferimento alla classe originale (oggetto) se è necessario accedere a dati di istanza specifici.

L'interfaccia pubblica alla classe principale rimane coerente e pulita, e si tira specifica elaborazione delle stringhe di una classe che probabilmente non appartiene in alcun modo ...

+0

mi piace questo metodo, ma sarebbe richiedono tutto il codice essere riscritta per l'uso di callback ... sembra troppo grande una soluzione. –

-1

si fa a non usare protetto? Avrei bisogno di sapere quale relazione tra queste due classi fosse in relazione l'una con l'altra per essere più chiara, ma dovresti essere in grado di estendere la classe e usare i nuovi metodi protetti che hai ereditato senza renderli pubblici.

Spero che questo aiuti!

Acclamazioni

Problemi correlati