php在实例中设置匿名函数
我刚刚开始学习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(); 我希望做的是在大量不同的应用程序中重复使用相同的代码,这样我
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, ...);