gpt4 book ai didi

php - 如何将参数传递给 PHP 中的匿名函数?

转载 作者:行者123 更新时间:2023-12-03 15:59:24 25 4
gpt4 key购买 nike

我有以下代码:

$evManager = $di->getShared('eventsManager');
$evManager->attach('dispatch', function($event, $dispatcher, $exception){
$dispatcher = new \Phalcon\Mvc\Dispatcher();
$dispatcher->setEventsManager($evManager);

return $dispatcher;
})

$evManager 是一个对象,它有一个名为 attach 的方法,它接受两个参数,这对我来说很清楚。第二个参数是一个匿名函数,它有三个参数($event、$dispatcher、$exception)。

所以我的问题是这三个参数是什么?为什么它们不是空的?什么将它们传递给匿名函数?看不懂...

我知道匿名函数会返回调度程序对象,并且附加方法会对其执行一些操作。唯一的问题是关于参数。

最佳答案

将匿名函数想象成一个带有方法的普通对象。你可以这样写代码:

class MyDispatcherHelper {
public function handle($event, $dispatcher, $exception) {
$dispatcher = new \Phalcon\Mvc\Dispatcher();
$dispatcher->setEventsManager($evManager);

return $dispatcher;
}
}

$evManager = $di->getShared('eventsManager');
$evManager->attach('dispatch', new MyDispatcherHelper());

所以现在不再有匿名函数了。“魔法”发生在 $evManager->attach 中。它的定义看起来像这样:

class EventsManager {
public function attach($eventName, $handler) {
// somehow listen for events named $eventName
...
// and get an instance of the Event
$myEvent = $listener->theEvent;

// if it's an exception maybe set $exception to something usefull?
...

//_call_ $handler when event occurs
call_user_func($handler, [$myEvent, $this, $exception]);
}
}

您应该阅读 call_user_func 的文档.

现在如果我们继续我的“用类示例替换匿名函数”,上面的代码将如下所示:

class EventsManager {
public function attach($eventName, MyDispatcherHelper $handler) {
// somehow listen for events named $eventName
...
// and get an instance of the Event
$myEvent = $listener->theEvent;

// if it's an exception maybe set $exception to something usefull?
...

//_call_ $handler when event occurs
$handler->handle($myEvent, $this, $exception);
}
}

这就是匿名函数的作用。您的代码与调用该函数无关。它不受您的控制,您不能告诉它用什么参数调用匿名函数,这就是 eventsManager 所做的。匿名函数不会在您定义它的地方被调用,您可以在其上定义任何个参数并根据您的喜好命名它们。

此外,匿名函数内部的代码可能看起来对外部代码施展魔法,但它不是$dispatcher->setEventsManager($evManager) 也是错误的,我在任何地方都没有看到 global $evManager

关于php - 如何将参数传递给 PHP 中的匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28295214/

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