
<?php
//Handler
abstract class Rescuer {
protected $next = null;
public $code = 0;
//HandleRequest()
function help(int $code) {
if ($this->code == $code) {
$this->toHelp();
} else if ($this->next != null) {
$this->next->help($code);
}
}
abstract function toHelp();
}
//ConcreteHandler
class Firefighter extends Rescuer {
function __construct($next) {
$this->next = $next;
$this->code = 1;
}
function toHelp() {
echo "call firefighters", "\n";
}
}
//ConcreteHandler
class Police extends Rescuer {
function __construct($next) {
$this->next = $next;
$this->code = 2;
}
function toHelp() {
echo "call the police", "\n";
}
}
//ConcreteHandler
class Ambulance extends Rescuer {
function __construct($next) {
$this->next = $next;
$this->code = 3;
}
function toHelp() {
echo "call an ambulance", "\n";
}
}
$ambulance = new Ambulance(null);
$police = new Police($ambulance);
$firefighter = new Firefighter($police);
$firefighter->help(1);
//printed: call firefighters
$firefighter->help(2);
//printed: call the police
$firefighter->help(3);
//printed: call an ambulance