3v4l.org

run code in 300+ PHP versions simultaneously
<?php interface MediatorInterface { public function send($message, Colleague $from); public function add(Colleague $colleague); } interface SuggestionProviderInterface { public function getSuggestionsFor($data); } class ContactSuggestionProvider implements SuggestionProviderInterface { public function getSuggestionsFor($data) { if (!isset($data['customer'])) { return [ 'contact a', // Suggestion 'contact b', // Suggestion 'contact c' // Suggestion ]; } return []; } } class WorkplaceSuggestionProvider implements SuggestionProviderInterface { public function getSuggestionsFor($data) { if (!isset($data['customer']) && !isset($data['contact'])) { return [ ['workplace a'], // Suggestion ['workplace b'] // Suggestion ]; } return []; } } class PaymentTypeSuggestionProvider implements SuggestionProviderInterface { public function getSuggestionsFor($data) { if (!isset($data['customer']) && !isset($data['contact']) && !isset($data['workplace'])) { return [ ['payment-type a'], // Suggestion ['payment-type b'] // Suggestion ]; } return []; } } abstract class Colleague { /** * @var Mediator */ private $mediator; abstract public function receive($suggestions); public function send($message) { $this->getMediator()->send($message, $this); } public function setMediator(MediatorInterface $mediator) { $this->mediator = $mediator; } public function getMediator() { return $this->mediator; } } class Customer extends Colleague { public function receive($suggestions) {} public function __change() { $this->send(['customer' => 'Ocramius']); } } class Contact extends Colleague { public function receive($suggestions) { var_dump($suggestions); } } class Workplace extends Colleague { public function receive($suggestions) { var_dump($suggestions); } } class PaymentType extends Colleague { public function receive($suggestions) { var_dump($suggestions); } } class SuggestionMediator implements MediatorInterface { private $colleagues = []; private $suggestionProviders = []; public function addSuggestionProvider(SuggestionProviderInterface $provider) { $this->suggestionProviders[] = $provider; } public function add(Colleague $colleague) { $colleague->setMediator($this); $this->colleagues[] = $colleague; } public function send($message, Colleague $from) { foreach ($this->colleagues as $colleague) { // what here I'll have here about providers? if ($from !== $colleague) { $colleague->receive($suggestions); } } } } $customer = new Customer(); $contact = new Contact(); $workplace = new Workplace(); $paymentType = new PaymentType(); $mediator = new SuggestionMediator(); $mediator->addSuggestionProvider(new ContactSuggestionProvider()); $mediator->addSuggestionProvider(new WorkplaceSuggestionProvider()); $mediator->addSuggestionProvider(new PaymentTypeSuggestionProvider()); $mediator->add($customer); $mediator->add($contact); $mediator->add($workplace); $mediator->add($paymentType); $customer->__change();

preferences:
51.64 ms | 402 KiB | 5 Q