2009-06-22 14 views
15

Mój szczególny scenariusz polega na przeprowadzeniu transformacji tekstu za pomocą wyrażeń regularnych w ramach metody prywatnej. Prywatna metoda wywołuje preg_replace_callback, ale wygląda na to, że wywołania zwrotne muszą być publiczne na obiektach, więc utknąłem w świecie prywatnym i ujawniłem szczegóły implementacji, kiedy wolałbym nie.Czy mogę używać prywatnych metod instancji jako wywołań zwrotnych?

Krótko mówiąc: czy mogę użyć metody instancji jako wywołania zwrotnego bez utraty enkapsulacji?

Dzięki.

Odpowiedz

21

Tak, wydaje się, możesz:

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

Więc wydaje się, że preg_replace_callback(), lub mechanizm wywołania zwrotnego PHP, zdaje sobie sprawę z zakresu, w którym została wywołana.

Testowane na 5.2.8

+0

funkcja lub błąd? działa z 5.3rc2/win32. – VolkerK

+2

Whoa, to niepokojąco niesamowite, jeśli uwzględnili ten zakres. Przyjmuję, kiedy go wypróbuję. –

+0

Potwierdzone w dniu 5.2.9 – jason

1

Czy można utworzyć oddzielną klasę pomocniczą do przetwarzania tekstu i utworzyć metodę wywołania zwrotnego w tej klasie (może być tam publicznie dostępna)? Możesz przekazać odwołanie do oryginalnej klasy (obiektu), jeśli potrzebujesz dostępu do określonych danych instancji.

publicznego interfejsu do swojej głównej klasie pozostaje spójna i czyste, i wyciągnąć konkretne przetwarzanie ciąg z klasą to chyba nie należy w żaden sposób ...

+0

lubię tę metodę, ale że to wymaga cały kod być refactored do użycia wywołania zwrotne ... wydaje się zbyt wielki obejście. –

-1

Nie możesz używać chronione? Musiałbym wiedzieć, jaki związek między tymi dwoma klasami był dla siebie bardziej przejrzysty, ale powinieneś być w stanie rozszerzyć klasę i korzystać z nowych chronionych metod, które odziedziczyłeś, nie upubliczniając ich.

Mam nadzieję, że to pomoże!

Cheers

Powiązane problemy