php - 如何使用 PHP 实现类似于 c# 事件和委托的东西?
问题描述
出于学习目的,我想使用 PHP “移植” c# wikipedia's mediator 示例,当前示例使用 delegates 和 event。所以我想知道在 PHP 上实现相同结果的最佳方法是什么。
使用 c# 实现的在线示例:https ://dotnetfiddle.net/fM9MD5
using System;
public delegate void MessageReceivedEventHandler(string message, string sender);
public class Mediator
{
public event MessageReceivedEventHandler MessageReceived;
public void Send(string message, string sender)
{
if (MessageReceived != null)
{
Console.WriteLine("Sending '{0}' from {1}", message, sender);
MessageReceived(message, sender);
}
}
}
public class Person
{
private Mediator _mediator;
public string Name { get; set; }
public Person(Mediator mediator, string name)
{
Name = name;
_mediator = mediator;
_mediator.MessageReceived += new MessageReceivedEventHandler(Receive);
}
private void Receive(string message, string sender)
{
if (sender != Name)
Console.WriteLine("{0} received '{1}' from {2}", Name, message, sender);
}
public void Send(string message)
{
_mediator.Send(message, Name);
}
}
public class Program
{
public static void Main()
{
var mediator = new Mediator();
var p1 = new Person(mediator,"john");
var p2 = new Person(mediator,"mary");
var p3 = new Person(mediator,"lucas");
p1.Send("hi !");
}
}
我使用 PHP 的尝试是:
<?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 实现类似于 c# 事件和委托的东西呢?
解决方案
PHP 中没有委托和事件。实现该模式的一种方法是使用接口。
每个接收者都必须实现该Receiver
接口,中介者向其所有注册的接收者发送消息:
<?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!');
?>
推荐阅读
- jenkins - 如何让詹金斯知道我的服务是重启成功失败
- pyspark - PySaprk - 使用 Databricks Spark 在 Synapse 中执行合并
- bash - 将完整脚本输出到变量
- javascript - React 中的两个 onPointerOver 事件冲突
- python-3.x - 无法为不使用 PEP 517 的 fbprophet 构建轮子
- linux - AWK 打印子网 0.69.100.in-abc.def
- r - R:有效地将多个数据集组合在一起
- c# - 根据来自多个 TextBoxes MVVM 的值过滤 WPF DataGrid (DataTable)
- visual-studio - GlobalSection ExtensibilityGlobals 在 .sln 文件中重复
- php - 加入两个数组