php在实例中设置匿名函数

php在实例中设置匿名函数,php,class,instance,anonymous-function,Php,Class,Instance,Anonymous Function,我刚刚开始学习PHP,我想知道是否有一种方法可以将匿名函数添加到类实例中 例如,让我们说 class A{ public B; } $c = new A(); //This is where I am getting a little confused... //The following wont work $c->B = function(){echo('HelloWorld');}; $c->B(); 我希望做的是在大量不同的应用程序中重复使用相同的代码,这样我

我刚刚开始学习PHP,我想知道是否有一种方法可以将匿名函数添加到类实例中

例如,让我们说

class A{
    public B;
}

$c = new A();

//This is where I am getting a little confused...
//The following wont work

$c->B = function(){echo('HelloWorld');};
$c->B();
我希望做的是在大量不同的应用程序中重复使用相同的代码,这样我就可以在特定的实例中“交换”和替换函数

我使用的是php5.3(所以匿名函数应该可以工作,只是不是我使用它们的方式)

非常感谢您抽出时间


-GK

您可以按照以下思路做一些事情(这也适用于非闭包的回调):


听起来像是在描述一个or——要实现这一点,需要更容易地与阅读您代码的其他开发人员沟通。

您可以在这项工作中使用神奇的功能。虽然不漂亮,但很管用

# real ugly, but PoC...

class a {
  function __call($f, $x) {
    call_user_func_array($this->$f, $x);
  }
}

$a = new a;
$a->b = function() { echo "Hello world"; };
$a->b();
像这样:

class A {
    public $B;

    public function __call($closure, $args)
    {
        call_user_func_array($this->$closure, $args);
    }
}

$c = new A();

$c->B = function () { echo('HelloWorld'); };
$c->B();
FWIW:

PHP5.3对匿名函数的处理很有趣。这行不通:

$c->B = function() { echo func_get_arg(0); };
$c->B("This fails :(");
这将有助于:

$c->B = function() { echo func_get_arg(0); };
$hilarious = $c->B;
$hilarious("This works!");
要解决这个问题,您需要使用一个类似的
\u调用
hack


这种行为将来可能会改变。was和补丁已经在上展开了讨论,它的语法可能允许您在没有_调用hack的情况下尝试做什么。不幸的是,这是为了让函数调用链接起作用。

您可以使用
调用用户\u func
直接执行可调用函数,而不是将一个调用魔术方法挂接到类中

class A {
    public $b;
}

$c = new A();
$c->b = function(){echo('HelloWorld');};

call_user_func($c->b);    // HelloWorld

显然,PHP最好提供一些语法来直接执行它

对于PHP7来说,这不再是一个问题

// no error
$result = ($this->anonFunc)();
$result = ($this->anonFunc)($arg1, $arg2, ...);

查看更多信息。

您能否详细介绍您正在尝试实现的这些不同应用程序?我认为简单的继承可能是一个更好的解决方案,但更多的信息会有所帮助。可能的重复:这里是GK,@Tim Cooper,我正在为一个游戏的服务器端工作,而服务器将由几十个应用程序组成,这些应用程序将管理游戏的不同部分。它们都非常相似,并且使用许多相同的类,但是它们都需要执行自定义函数的能力。。。我知道,。。。谢谢你的帮助@我想你是对的,我试着先查一下这个问题,但显然我查得不够仔细,谢谢!!gk在这里,我会调查这个。。。我需要弄清楚到底是什么。。。非常感谢你为我指明了正确的方向!编辑以还原否决票。我看到你发布了与user358390完全相同的解决方案(减去一个微小的差异),但我没有注意到时间如此接近,所以我给出了质疑的好处——仅仅使用搞笑的方法有什么错?
// no error
$result = ($this->anonFunc)();
$result = ($this->anonFunc)($arg1, $arg2, ...);