gpt4 book ai didi

php - 如何在方法闭包中访问全局对象

转载 作者:可可西里 更新时间:2023-11-01 14:00:33 25 4
gpt4 key购买 nike

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

class DiModule
{
private $Callbacks;

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

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

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

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];
}
}

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

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 时,我用谷歌搜索了很多次但找不到解决方案。

最佳答案

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

所以这样:

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

应该这样写:

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

关于php - 如何在方法闭包中访问全局对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39790744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com