【问题标题】:How can I find out the classname of an object a closure is bound to?如何找出闭包绑定到的对象的类名?
【发布时间】:2017-05-27 10:23:04
【问题描述】:

我有一些第三方代码可以创建一个闭包,然后绑定到一个对象。 闭包对象上的 print_r 会产生这样的结果:

Closure Object ( [this] => am4Widgets Object ( ) )

现在我需要检索绑定对象的“instanceof”(在本例中为“am4Widgets”),某种伪代码,如

print_r(myClosureObject instanceofboundobject am4Widgets);

应该输出'TRUE'。

我已经搜索了 php.net 但无济于事。

提前感谢您的任何想法/建议。

更新:

这里是创建闭包的地方(我无法修改的代码的 sn-p):

function initActions()
{
    parent::initActions();
    .
    .
    .
    add_action('wp_head', function(){
        $ajax_url =  admin_url( 'admin-ajax.php' );
        echo <<<CUT
<script>...some javascript code...</script>
CUT;
    });
}

实际上,我要做的是从 wp_head 中解开闭包,因为我需要在页脚中使用它。

我正在使用全局 wordpress 的 $wp_filters 来访问所有已注册的钩子,但现在我需要一种方法来唯一地标识我想要解除钩子的闭包,如果有一种方法可以访问闭包的绑定对象。

【问题讨论】:

  • 你如何定义你的«闭包对象»?
  • @German Lashevich 在这种情况下,“闭包”是由 wordpress 的底层框架基于作为第二个参数传递给 add_action() 函数的“functio(){}”块构建的。
  • @yivi 感谢 Yivi 的提示。已经找到谷歌搜索。它非常接近我正在寻找的东西,但并不完全相同。第一个答案中的方法将删除同一优先级内的 all 闭包,而我正在寻找一种方法来删除 only 由其绑定对象标识的闭包。一个肮脏的黑客将是封装 ob_start() 和 ob_end_clean() 之间的 print_r() 调用并搜索字符串(在我的例子中:am4Widget),但是,正如所说,这是一个黑客,一个肮脏的黑客。如果可能的话,我宁愿采用更多的 OO 代码方法。

标签: php oop closures classname


【解决方案1】:

您可以为此目的使用ReflectionFunction 对象。

class A {}

$closure = (function () {
    echo '$this class from closure: ' . get_class($this) . "\n";
})->bindTo(new A());

$closure();

$fn = new ReflectionFunction($closure);
echo '$this class from reflection: ' . get_class($fn->getClosureThis());

输出:

$this from closure: A
$this from reflection: A

【讨论】:

    猜你喜欢
    • 2015-09-20
    • 2012-02-03
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多