【问题标题】:How can I call a custom function that is part of a class in PHP (wordpress do_action style)?如何调用属于 PHP 类的自定义函数(wordpress do_action 样式)?
【发布时间】:2012-07-27 04:07:15
【问题描述】:

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

【问题讨论】:

    标签: php wordpress oop closures


    【解决方案1】:

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

    $contextAndFunction();
    

    Here's a demo.

    否则,call_user_func 将按原样工作。

    call_user_func($contextAndFunction);
    

    And there's a demo.

    【讨论】:

    • 似乎不起作用。更新的问题包括我对你的例子的测试。
    • @cwd:您使用的是什么版本的 PHP?不管怎样,试试call_user_method($contextAndFunction[1], $contextAndFunction[0])。虽然...自 PHP 4.1.0. 以来已弃用
    • 在开发盒上使用 5.3.1,然后在服务器上使用 5.3(但不是 5.4)。这给了我“已弃用:函数 call_user_method() 已弃用”并且没有输出。
    • @cwd:抱歉,显然它只适用于 PHP 5.4。 call_user_func 为我工作,不过... codepad.viper-7.com/giBwgw
    • 好的,很高兴知道 5.4 的好处。我认为我在 5.3 中的错误实际上是在测试时没有使用 text/plain 标头(我通常启用),哈哈。所以很明显,即使我让它工作了,它也显示为空白。
    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多