首页 > 解决方案 > 如何使用 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# 事件和委托的东西呢?

标签: phpevent-handlingportingmediator

解决方案


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!');
?>

推荐阅读