如何在PHP中调用属于类的自定义函数(wordpress do_action样式)?

时间:2012-07-28 23:16:08

标签: php wordpress oop closures

Wordpress使用钩子和动作来实现可扩展性。插件可能看起来像这样:

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>';
    }
}

如果我在Wordpress之外运行该代码,我希望add_action能够正常工作 - 即使它只是立即调用该函数。

我读过这些:

第二个与我想要做的非常接近,但我不认为它是为了使用属于类的函数而设计的。

我尝试使用call_user_function,但我不确定如何给它array($this,'my_footer')这些东西:

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

我也试过这个,但是你可以告诉我的OOP并不好,所以我在努力:

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

    $context->$function();

}

使用minitech的建议进行测试失败:

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();

产地:

Fatal error: Function name must be a string

1 个答案:

答案 0 :(得分:0)

如果您使用的是PHP 5.4,那么它已经是可调用的:

$contextAndFunction();

Here's a demo.

否则,call_user_func将按原样运行。

call_user_func($contextAndFunction);

And there's a demo.