我刚刚开始使用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
答案 0 :(得分:10)
您可以对此作业使用__call魔术功能。不是美女,但它有效..
像这样: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();
答案 1 :(得分:5)
FWIW:
PHP 5.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!");
要解决此问题,您需要使用像provided by Oden那样的__call
黑客。
此行为可能将来发生变化。 array dereferencing RFC为recently committed to PHP's trunk,该补丁引发了对function call chaining的讨论,其语法可能允许您在没有__call hack的情况下尝试执行的操作。不幸的是,proven difficult in the past使函数调用链工作。
答案 2 :(得分:4)
# 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();
答案 3 :(得分:2)
听起来像是在描述Strategy Pattern或Decorator Pattern - 有other ways来实现这一目标,这可以更容易地与其他阅读代码的开发人员进行沟通
答案 4 :(得分:1)
你可以沿着这些方向做一些事情(这也适用于不是闭包的回调):
<?php
class A {
private $fun;
function setFun($fun) {
if (!is_callable($fun))
throw new InvalidArgumentException();
$this->fun = $fun;
}
public function fun() {
call_user_func_array($this->fun, func_get_args());
}
}
$c = new A();
$c->setFun(function($a) { echo('HelloWorld ' . $a);});
$c->fun("here");
给出了HelloWorld here
。
那就是说,你也应该考虑继承或decorator pattern。
答案 5 :(得分:1)
这不再是PHP 7的问题;
// no error
$result = ($this->anonFunc)();
$result = ($this->anonFunc)($arg1, $arg2, ...);
详细了解AST。
答案 6 :(得分:0)
您可以使用call_user_func
直接执行callable,而不是将__call魔术方法挂钩到您的类中。
class A {
public $b;
}
$c = new A();
$c->b = function(){echo('HelloWorld');};
call_user_func($c->b); // HelloWorld
显然,PHP提供一些直接执行它的语法会很好。