Domanda

Il mio particolare scenario prevede di eseguire alcune trasformazioni di testo usando 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 uscire dal mondo privato ed esporre i dettagli dell'implementazione quando preferirei di no.

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

Grazie.

È stato utile?

Soluzione

Sì, sembra che tu possa:

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

Quindi sembra che preg_replace_callback () , o meccanismo di callback di PHP, sia a conoscenza dell'ambito in cui è stato chiamato.

Testato su 5.2.8

Altri suggerimenti

Puoi creare una classe di supporto 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 (oggetto) originale se è necessario accedere a dati di istanza specifici.

L'interfaccia pubblica per la tua classe principale rimane coerente e pulita e estrai l'elaborazione di stringhe specifiche da una classe a cui probabilmente non appartiene comunque ...

Non puoi usare protetto? Avrei bisogno di sapere quale fosse la relazione di queste due classi in relazione tra loro per essere più chiari, ma dovresti essere in grado di estendere la classe e utilizzare i nuovi metodi protetti che hai ereditato senza renderli pubblici.

Spero che questo aiuti!

Saluti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top