¿Cómo puedo llamar a una función personalizada que es parte de una clase en PHP (estilo wordpress do_action)?

Wordpress usa ganchos y acciones para la extensibilidad. Un complemento podría verse así:

class myLightbox
{
    function __construct()
    {
        add_action('wp_footer',array($this,'my_footer'));
    }

    function my_footer()
    {
        echo '<script src="http://external-site.com/lightbox.js" ></script>';
    }
}

Si ejecuto ese código fuera de Wordpress, me gustaría que el add_action para trabajar, incluso si solo llama a la función de inmediato.

Leí estos:

El segundo está bastante cerca de lo que me gustaría hacer, pero no creo que haya sido diseñado para trabajar con funciones que son parte de una clase.

Intenté usar call_user_function pero no estoy seguro de cómo darle el array($this,'my_footer') cosas:

function add_action($whenToCall,$contextAndFunction=array())
{
    call_user_func($contextAndFunction);
}

También probé esto, pero como pueden ver, mi programación orientada a objetos no es excelente, así que estoy luchando:

function add_action($whenToCall,$contextAndFunction=array())
{
    $function = array_pop($contextAndFunction);
    $context = array_pop($contextAndFunction);

    $context->$function();

}

Prueba fallida usando minitechsugerencia de:

class myLightbox
{
    function __construct()
    {
        add_action('wp_footer',array($this,'my_footer'));
    }

    function my_footer()
    {
        echo '<script src="http://external-site.com/lightbox.js" ></script>';
    }
}


function add_action($whenToCall,$contextAndFunction=array())
{
    $contextAndFunction();
}


$myLightbox = new myLightbox();

Produce:

Fatal error: Function name must be a string

preguntado el 29 de julio de 12 a las 00:07

1 Respuestas

Si está utilizando PHP 5.4, ya es invocable:

$contextAndFunction();

Aquí tienes una demostración.

De lo contrario, call_user_func funcionará como está.

call_user_func($contextAndFunction);

Y hay una demostración.

Respondido 29 Jul 12, 01:07

no parece funcionar pregunta actualizada para incluir mi prueba de su ejemplo. - cwd

@cwd: ¿Qué versión de PHP estás usando? De todos modos, intente call_user_method($contextAndFunction[1], $contextAndFunction[0]). Aunque... eso ha quedado en desuso desde PHP 4.1.0. - Ry-

usando 5.3.1 en el cuadro de desarrollo, luego 5.3 (pero no 5.4) en el servidor. eso me da "Obsoleto: la función call_user_method () está obsoleta" y no hay salida. - cwd

@cwd: Lo siento, aparentemente solo funciona en PHP 5.4. call_user_func aunque a mi me funciona... codepad.viper-7.com/giBwgw - Ry-

Ok, genial saber los beneficios de 5.4. Creo que mi error en 5.3 fue en realidad no usar el text/plain encabezado (que generalmente habilito) cuando pruebo, lol. Entonces, aparentemente, incluso cuando lo hice funcionar, aparecía en blanco. - cwd

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.