php在实例中设置匿名函数

时间:2010-06-13 21:50:45

标签: 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();

我希望做的是在大量不同的应用程序中重复使用相同的代码,并使其能够在特定情况下“交换”并替换函数。

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

非常感谢您的时间!!

-GK

7 个答案:

答案 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 RFCrecently 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 PatternDecorator 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提供一些直接执行它的语法会很好。