如何使用PHP实现类似于c#事件和委托的东西?

如何使用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“移植”,当前示例使用delagates和event。所以我想知道在PHP上实现相同结果的最佳方法是什么

使用c#实现的在线示例:

我使用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中没有委托和事件。实现该模式的一种方法是使用

每个接收者必须实现
接收者
接口,中介者向其所有注册接收者发送消息:

<?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()添加到您的学习中…:)