如何使用PHP实现类似于c#事件和委托的东西?
出于研究目的,我想使用PHP“移植”,当前示例使用delagates和event。所以我想知道在PHP上实现相同结果的最佳方法是什么 使用c#实现的在线示例: 我使用PHP的尝试是:如何使用PHP实现类似于c#事件和委托的东西?,php,event-handling,porting,mediator,Php,Event Handling,Porting,Mediator,出于研究目的,我想使用PHP“移植”,当前示例使用delagates和event。所以我想知道在PHP上实现相同结果的最佳方法是什么 使用c#实现的在线示例: 我使用PHP的尝试是: <?php class Mediator { public $MessageReceived; public function Send(string $message, string $sender) { if ($this->MessageReceived !
<?php
class Mediator {
public $MessageReceived;
public function Send(string $message, string $sender)
{
if ($this->MessageReceived != null)
{
printf("Sending '%s' from %s", $message, $sender);
$this->MessageReceived($message, $sender);
}
}
}
class Person {
private Mediator $_mediator;
public string $Name;
public function __construct(Mediator $mediator, string $name)
{
$this->Name = $name;
$this->_mediator = $mediator;
$this->_mediator->MessageReceived += $this->Receive;
}
private function Receive(string $message, string $sender)
{
if ($sender != $this->Name)
printf("%s received '%s' from %s", $this->Name, $message, $sender);
}
public function Send(string $message)
{
$this->_mediator->Send($message, $this->Name);
}
}
$mediator = new Mediator();
$p1 = new Person($mediator,"john");
$p2 = new Person($mediator,"mary");
$p3 = new Person($mediator,"lucas");
$p1->Send("hi !");
PHP中没有委托和事件。实现该模式的一种方法是使用
每个接收者必须实现接收者
接口,中介者向其所有注册接收者发送消息:
<?php
interface Receiver
{
public function receive(string $message, string $sender);
}
class Mediator
{
private $receivers;
public function __construct()
{
$this->receivers = [];
}
public function addReceiver(Receiver $receiver)
{
// Registers a receiver
$this->receivers []= $receiver;
}
public function send(string $message, string $sender)
{
// Sends a message to all receivers
foreach($this->receivers as $receiver)
$receiver->receive($message, $sender);
}
}
class Person implements Receiver
{
private $mediator;
private $name;
public function __construct(Mediator $mediator, string $name)
{
$this->mediator = $mediator;
$this->name = $name;
$mediator->addReceiver($this);
}
public function receive(string $message, string $sender)
{
if($sender != $this->name)
printf("%s received '%s' from %s\n", $this->name, $message, $sender);
}
public function send(string $message)
{
$this->mediator->send($message, $this->name);
}
}
$mediator = new Mediator();
$p1 = new Person($mediator, 'John');
$p2 = new Person($mediator, 'Mary');
$p3 = new Person($mediator, 'Lucas');
$p1->send('Hi!');
?>
PHP中没有委托和事件。实现该模式的一种方法是使用
每个接收者必须实现接收者
接口,中介者向其所有注册接收者发送消息:
<?php
interface Receiver
{
public function receive(string $message, string $sender);
}
class Mediator
{
private $receivers;
public function __construct()
{
$this->receivers = [];
}
public function addReceiver(Receiver $receiver)
{
// Registers a receiver
$this->receivers []= $receiver;
}
public function send(string $message, string $sender)
{
// Sends a message to all receivers
foreach($this->receivers as $receiver)
$receiver->receive($message, $sender);
}
}
class Person implements Receiver
{
private $mediator;
private $name;
public function __construct(Mediator $mediator, string $name)
{
$this->mediator = $mediator;
$this->name = $name;
$mediator->addReceiver($this);
}
public function receive(string $message, string $sender)
{
if($sender != $this->name)
printf("%s received '%s' from %s\n", $this->name, $message, $sender);
}
public function send(string $message)
{
$this->mediator->send($message, $this->name);
}
}
$mediator = new Mediator();
$p1 = new Person($mediator, 'John');
$p2 = new Person($mediator, 'Mary');
$p3 = new Person($mediator, 'Lucas');
$p1->send('Hi!');
?>
您要查找的内容已通过我的Symfony组件完成。你可以在
它的实现方式并不完全相同,但“Symfony EventDispatcher组件实现了Mediator和Observer设计模式,使所有这些成为可能,并使您的项目真正具有可扩展性。”
您可以通过将其添加到项目依赖项中来开始使用它
composer require symfony/event-dispatcher
以下是从中复制的一个简单示例:
<?php
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MyListener
{
public function onFooAction(Event $event)
{
echo __CLASS__ . '/' . __METHOD__;
echo "<br>";
}
}
class MySubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'foo.action' => ['onFooAction', 0],
'bar.action' => ['onBarAction', 0],
'baz.action' => ['onBazAction', 0]
];
}
public function onFooAction()
{
echo __CLASS__ . '/' . __METHOD__;
echo "<br>";
}
public function onBarAction()
{
echo __CLASS__ . '/' . __METHOD__;
echo "<br>";
}
public function onBazAction()
{
echo __CLASS__ . '/' . __METHOD__;
echo "<br>";
}
}
$dispatcher = new EventDispatcher();
$listener = new MyListener();
$dispatcher->addListener('foo.action', array($listener, 'onFooAction'));
$subscriber = new MySubscriber();
$dispatcher->addSubscriber($subscriber);
$dispatcher->addListener('baz.action', array($listener, 'onFooAction'));
$dispatcher->addListener('foo.action', function() {
echo __FUNCTION__;
echo "<br>";
});
echo "<h2>START</h2>";
echo "<h4>FOO-ACTION</h4>";
$dispatcher->dispatch('foo.action');
echo "<h4>BAR-ACTION</h4>";
$dispatcher->dispatch('bar.action');
echo "<h4>BAZ-ACTION</h4>";
$dispatcher->dispatch('baz.action');
echo "<h2>END</h2>";
您要查找的内容已在我的Symfony组件中完成。你可以在
它的实现方式并不完全相同,但“Symfony EventDispatcher组件实现了Mediator和Observer设计模式,使所有这些成为可能,并使您的项目真正具有可扩展性。”
您可以通过将其添加到项目依赖项中来开始使用它
composer require symfony/event-dispatcher
以下是从中复制的一个简单示例:
<?php
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MyListener
{
public function onFooAction(Event $event)
{
echo __CLASS__ . '/' . __METHOD__;
echo "<br>";
}
}
class MySubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'foo.action' => ['onFooAction', 0],
'bar.action' => ['onBarAction', 0],
'baz.action' => ['onBazAction', 0]
];
}
public function onFooAction()
{
echo __CLASS__ . '/' . __METHOD__;
echo "<br>";
}
public function onBarAction()
{
echo __CLASS__ . '/' . __METHOD__;
echo "<br>";
}
public function onBazAction()
{
echo __CLASS__ . '/' . __METHOD__;
echo "<br>";
}
}
$dispatcher = new EventDispatcher();
$listener = new MyListener();
$dispatcher->addListener('foo.action', array($listener, 'onFooAction'));
$subscriber = new MySubscriber();
$dispatcher->addSubscriber($subscriber);
$dispatcher->addListener('baz.action', array($listener, 'onFooAction'));
$dispatcher->addListener('foo.action', function() {
echo __FUNCTION__;
echo "<br>";
});
echo "<h2>START</h2>";
echo "<h4>FOO-ACTION</h4>";
$dispatcher->dispatch('foo.action');
echo "<h4>BAR-ACTION</h4>";
$dispatcher->dispatch('bar.action');
echo "<h4>BAZ-ACTION</h4>";
$dispatcher->dispatch('baz.action');
echo "<h2>END</h2>";
当你说你“不成功”时,你是什么意思?出了什么问题?你是怎么修的?此外,您还应将PSR-12()添加到您的学习中…:)当你说你“不成功”时,你是什么意思?出了什么问题?你是怎么修的?此外,您还应将PSR-12()添加到您的学习中…:)