如何访问方法闭包内的全局对象

时间:2016-09-30 11:42:11

标签: php anonymous-function

我目前有一个依赖注入模块,它允许我创建一个对象工厂:

class DiModule
{
    private $Callbacks;

    public function set(
        $foo,
        $bar
    ) {
        $this->Callbacks[$foo] = $bar;
    }

    public function get(
        $foo
    ) {
        return $this->Callbacks[$foo];
    }
}

然后我有一个事件对象,它存储方法闭包和将触发事件的会话。

class Event
{
    private $Sesh;
    private $Method;

    public function set(
        $sesh = array(),
        $method
    ) {
        $this->Sesh = $sesh;
        $this->Method = $method;
    }

    public function get(
    ) {
        return [$this->Sesh,$this->Method];
    }
}

然后我有一个侦听器对象,它搜索会话集并触发与该对象关联的事件。

class Listener
{
    private $Sesh;
    public function setSesh(
        $foo
    ) {
        $this->Sesh = $foo;
    }

    private $Event;
    public function set(
        $foo,
        Event $event
    ) {
        $this->Event[$foo] = $event;
    }

    public function dispatch(
        $foo
    ) {
        $state = true;

        if(isset($this->Event[$foo]))
        {
            foreach($this->Event[$foo]->get()[0] as $sesh)
            {
                if(!isset($this->Sesh[$sesh]) || empty($this->Sesh[$sesh]))
                {
                    $state = false;
                }
            }
        }

        return ($state) ? [true, $this->Event[$foo]->get()[1]()] : [false, "Event was not triggered."];
    }
}

这是正在执行的一个例子

$di = new DiModule();

$di->set('L', new Listener());
$di->set('E', new Event());

$di->get('E')->set(['misc'], function () { global $di; return $di; });

$di->get('L')->setSesh(array('misc' => 'active')); // not actual sessions yet
$di->get('L')->set('example', $di->get('E'));
var_dump($di->get('L')->dispatch('example'));

问题是,当我尝试在闭包内访问我的全局$di时,我已经多次搜索,但无法找到解决方案。

2 个答案:

答案 0 :(得分:4)

您需要使用use关键字从闭包中访问外部变量。

所以这个:

$di->get('E')->set(['misc'], function () { global $di; return $di; });

应该这样写:

$di->get('E')->set(['misc'], function () use ($di) { return $di; });

答案 1 :(得分:2)

'12-JUN-87'类的set()get()方法似乎有不匹配的名称/实现。

您发布的代码包含以下方法:

DiModule

最有可能的是:

function get($foo, $bar) { /* ... */ }
function set($foo) { /* ... */ }

为了减少这些错误,请为您的参数提供有意义的名称(例如function get($foo) { /* ... */ } function set($foo, $bar) { /* ... */ } $key),而不是通用的$value$foo。然后发现它会更容易。