Pergunta

O meu cenário específico envolve fazer alguma transformação de texto usando expressões regulares dentro de um método particular. As chamadas de método particulares preg_replace_callback, mas é parece que retornos de chamada precisa ser público em objetos, então eu estou preso sair do mundo privado e expor detalhes de implementação quando eu prefiro não.

Assim, em poucas palavras: Posso usar um método de instância como um retorno de chamada sem perder encapsulamento

?

Graças.

Foi útil?

Solução

Sim, parece que você pode:

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

Assim, parece que preg_replace_callback(), ou mecanismo de retorno de chamada de PHP, está ciente do escopo em que foi chamado.

Testado em 5.2.8

Outras dicas

Você pode criar uma classe auxiliar separado para processamento de texto, e criar o método de retorno dentro dessa classe (que pode ser público lá)? Você pode passar uma referência para a classe original (objeto) se precisar de acesso a dados de instância específicas.

A interface pública para a sua classe principal permanece consistente e limpo, e você puxar cadeia específica processamento fora de uma classe que provavelmente não pertence de qualquer maneira ...

Você pode não usar protegido? Eu preciso saber qual a relação dessas duas classes foram em relação uns aos outros para ser mais claro, mas você deve ser capaz de estender a classe e usar os novos métodos protegidos que você herdou, sem torná-las públicas.

Espero que isso ajude!

Felicidades

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top