2011-07-04 13 views
8

estoy usando preg_replace_callback para buscar y reemplazar enlaces de texto con enlaces en vivo:preg_replace_callback() problema

http://www.example.com 

a

<a href='http://www.example.com'>www.example.com</a> 

La función de devolución de llamada que estoy ejecutando su función dentro de otra con la que es clase, entonces cuando intento:

return preg_replace_callback($pattern, "Utilities::LinksCallback", $input); 

Aparece un error que dice que la función no existe. ¿Algunas ideas?

+1

'Utilidades :: LinksCallback' no existe. –

+0

No necesariamente. No puede pasar una cadena de devolución de llamada así en todas las versiones de PHP. –

Respuesta

20

En PHP cuando se utiliza un método de clase como una devolución de llamada, debe utilizar la forma de devolución de llamada array. Es decir, usted crea una matriz cuyo primer elemento es la clase (si el método es estático) o una instancia de la clase (si no es así), y el segundo elemento es la función para llamar. P.ej.

class A { 
    public function cb_regular() {} 
    public static function cb_static() {} 
} 

$inst = new A; 

preg_replace_callback(..., array($inst, 'cb_regular'), ...); 

preg_replace_callback(..., array('A', 'cb_static'), ...); 

La función que está llamando, por supuesto, tiene que sido visible desde dentro del ámbito en el que utilice la devolución de llamada.

Consulte http://php.net/manual/en/language.pseudo-types.php para obtener detalles de las devoluciones de llamada válidas.

N.B. Leyendo allí, parece que desde 5.2.3, puede usar su método, siempre y cuando la función de devolución de llamada sea estática.

+0

Sí, gracias. Mi código debe ser correcto de acuerdo con el método que usa PHP.net, aunque su ejemplo es similar, usan una función regular, no un método estático de clase. Editar: El problema fue simplemente omitir la palabra clave estática. – Lee

+2

Perdí el NB, que era mi problema. FYI - si se usa dentro de una instancia de clase, 'array ($ this, 'method_name')' hace el truco. – benmarks

4

Puede hacerlo de esta manera:

return preg_replace_callback($pattern, array("Utilities", "LinksCallback"), $input) 

Referencia: http://php.net/callback

+1

No sé sobre funciones estáticas, por lo que la solución anterior puede ser correcta. Pero si se trata de una función normal, utilice esto: 'return preg_replace_callback ($ pattern, array (& $ this," LinksCallback "), $ input);' –

+0

Eso definitivamente funcionará para las instancias. Para funciones estáticas, mi notación es obligatoria. Supongo que (Zend) asumen que la mayoría de las referencias a funciones estáticas serán aquellas dentro de clases estáticas. –

+0

Sí, LinksCallback() es estático y en la clase Utilidades. Voy a intentarlo gracias. – Lee