当前位置: 首页 > 面试题库 >

直接调用分配给对象属性的闭包

韩阳飙
2023-03-14
问题内容

我希望能够直接调用分配给对象属性的闭包,而无需将闭包重新分配给变量然后再调用它。这可能吗?

下面的代码不起作用,并导致Fatal error: Call to undefined method stdClass::callback()

$obj = new stdClass();
$obj->callback = function() {
    print "HelloWorld!";
};
$obj->callback();

问题答案:

从PHP7开始,您可以

$obj = new StdClass;
$obj->fn = function($arg) { return "Hello $arg"; };
echo ($obj->fn)('World');

或使用Closure ::call(),尽管不适用于StdClass

在PHP7之前,您必须实现magic __call方法来拦截调用并调用回调(StdClass当然不可能,因为您无法添加该__call方法)

class Foo
{
    public function __call($method, $args)
    {
        if(is_callable(array($this, $method))) {
            return call_user_func_array($this->$method, $args);
        }
        // else throw exception
    }
}

$foo = new Foo;
$foo->cb = function($who) { return "Hello $who"; };
echo $foo->cb('World');

请注意,您不能做

return call_user_func_array(array($this, $method), $args);

__call体内,因为这会触发__call无限循环。



 类似资料:
  • 问题内容: 这有效: 但这不是: 为什么?我有一种感觉,这与对象是内置类有关,但是我发现这并不令人满意,因为我在MyClass的声明中没有进行任何更改。 问题答案: Python将属性存储在字典中。您可以将属性添加到,看到它具有 : 重要的区别是没有属性。

  • 最近我一直在阅读Java不同世代的对象分配。大多数时候,新对象在伊甸园(年轻一代的一部分)中分配,然后如果满足以下任何标准,它们就会晋升为老一代。 (1) 当从伊甸园(或)另一个幸存者空间(从)复制对象时,对象的年龄已达到寿命阈值 (2)幸存者空间(到)已满 但是也有一种特殊情况,即对象直接在旧一代中分配,而不是从年轻一代中提升。当我们试图创建的对象很大(可能是几个MB的数量级)时,就会发生这种情

  • 我有这个程序: 我期望看到的是在年轻一代中创建整数对象,其中一些对象添加到转移到老一代的链表中。所以我希望年轻一代的GC能够始终如一地发生,对象被移动到生存空间,然后再从那里移动到老一代。但我发现的是,老一代的GC一直在发生,年轻一代的GC根本没有发生。这是JVM正在做的某种优化吗?在旧代中直接创建对象的地方?正如您在下图中看到的,年轻的gc只发生了两次,而老的gc发生了41次。仅旧代GC 接下来

  • 我有一些对象实现了一些接口,但是它们也有额外的属性。当我来序列化它们(保存在文件中)时,我想删除所有这些额外的属性,只保留与接口匹配的属性。 有没有办法“清理”有关给定接口的对象。我正在尝试 要获取对象属性的完整列表,并与接口属性的完整清单进行比较,但我无法找到获取接口属性列表的方法 编辑:我在这里找到了一种方法:如何基于TypeScript中的接口文件定义创建对象? 跟 但是我看到当我使用 Ob

  • 我已经开始使用PowerShell来完成一些事情,并在PowerShell中使用变量。 我遇到的问题是,当我将变量分配给类中定义的变量时,测试返回而不是。 示例代码: 现在,对未定义变量< code>$test2的测试返回< code>true,因为PowerShell中的每个未定义变量都被赋予了< code>$null。 但是,如果我测试我分配给的对象的属性,则会测试的 是不是因为在PowerS

  • 大家好,我需要序列化一个带有字典的对象的响应,动态地离开了json示例。我试图在一个c#类中序列化这个响应对象(request_validator),但这不起作用,请谁能帮助我,有什么想法吗?对不起我的英语谢谢