Pregunta

Mi escenario particular implica hacer alguna transformación de texto usando expresiones regulares dentro de un método privado. El método privado llama preg_replace_callback, pero parece que las devoluciones de llamada deben ser públicas en los objetos, por lo que estoy atrapado en el mundo privado y exponiendo los detalles de implementación cuando prefiero no hacerlo.

Entonces, en pocas palabras: ¿Puedo usar un método de instancia como devolución de llamada sin perder la encapsulación?

Gracias.

¿Fue útil?

Solución

Sí, parece que puedes:

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

Entonces parece que preg_replace_callback () , o el mecanismo de devolución de llamada de PHP, es consciente del alcance en el que se llamó.

Probado en 5.2.8

Otros consejos

¿Puede crear una clase auxiliar separada para el procesamiento de texto y crear el método de devolución de llamada dentro de esa clase (puede ser público allí)? Puede pasar una referencia a la clase original (objeto) si necesita acceso a datos de instancia específicos.

La interfaz pública a su clase principal permanece constante y limpia, y extrae el procesamiento de cadenas específico de una clase en la que probablemente no pertenece de todos modos ...

¿No puedes usar protegido? Necesito saber cuál era la relación de estas dos clases entre sí para ser más claro, pero debería poder extender la clase y usar los nuevos métodos protegidos que ha heredado sin hacerlos públicos.

¡Espero que esto ayude!

Saludos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top