3v4l.org

run code in 300+ PHP versions simultaneously
<?php interface Roulette { public function move(); } interface Checkable { public function check(); } interface Rotatable { public function rotate(); } abstract class CircleLoad implements Rotatable, Checkable { protected $charges = null; public function __construct() { $this->setCharges(); } abstract protected function setCharges(); } class SixChargedRevolver extends CircleLoad { CONST CHARGES = 6; protected $loaded = null; protected $current = null; public function __construct() { $this->loaded = mt_rand(1, self::CHARGES); $this->current = 1; } public function check() { return $this->current==$this->loaded; } public function rotate() { $rotations = mt_rand(1, 2*self::CHARGES); $this->current = 1 + $rotations%self::CHARGES; } protected function setCharges() { $this->charges = self::CHARGES; } } abstract class RouletteGame implements Roulette { protected $playable = null; public function setPlayable(CircleLoad $playable) { $this->playable = $playable; } } class RussianRoulette extends RouletteGame { public function move() { $this->playable->rotate(); if($this->playable->check()) { die('Boom..'); } echo 'Click!'; } } class RussianRouletteFactory { public function create() { $playable = new SixChargedRevolver(); $roulette = new RussianRoulette(); $roulette->setPlayable($playable); return $roulette; } } $owner = new RussianRouletteFactory; $roulette = $owner->create(); $roulette->move(); $roulette->move(); $roulette->move(); $roulette->move();

preferences:
30.26 ms | 402 KiB | 5 Q