<?php
echo '$door is a Door...
$door->knob->turn(); $door->can_be_opened(); => true
$door->knob->unturn(); $door->can_be_opened(); => false
$door->push(); $door->is_open(); => false
$door->knob->turn(); $door->push();; $door->is_open(); => true
$door->pull; $door->is_open(); => false
$door->can_be_opened(); => false
$door is a DoorWithCloser...
$door->knob->turn(); $door->push(); $door->is_open(); => true
1 second after, $door->is_open(); => true
4 seconds after, $door->is_open(); => false
$door is a DoorWithStopper...
$door->knob->turn(); $door->push(); $door->is_open(); => true
$door->be_stoppered_on(); $door->pull(); $door->is_close(); =>false
$door->be_stoppered_off(); $door->pull(); $door->is_close(); =>true
$door is a DoorWithStopperCloser...
$door->knob->turn(); $door->push(); $door->is_open(); => true
$door->be_stoppered_on(); then 4 seconds after, $door->is_close(); => false
$door->be_stoppered_off(); then 4 seconds after, $door->is_close(); => true
$door->knob->turn(); $door->push(); $door->is_open(); => true
$door->be_stoppered_on(); then 4 seconds after, $door->is_close(); => false
$door->push(); then 4 seconds after, $door->is_close(); => true';
class Knob {
private $door;
private $latched = true;
function __construct($door) { $this->door = $door; }
function is_latched_off() { return !$this->latched; }
function turn() { $this->latched = false; }
function unturn() { if ($this->door->basicIs_close()) { $this->latched = true; } }
}
class Door {
protected $closed = true;
public $knob;
function __construct() { $this->knob = new Knob($this); }
function basicIs_open() { return !$this->closed; }
function basicIs_close() { return !$this->basicIs_open(); }
function is_open() { return $this->basicIs_open(); }
function is_close() { return !$this->is_open(); }
function can_be_opened() { return !$this->closed || $this->knob->is_latched_off(); }
function pull() { $this->closed = true; $this->knob->unturn(); }
function push() { if ( $this->can_be_opened() ) { $this->closed = false; } }
}
$door = new Door();
echo "\$door is a Door...\n";
$door->knob->turn();
echo '$door->knob->turn(); $door->can_be_opened(); => '.($door->can_be_opened()?'true':'false')."\n";
$door->knob->unturn();
echo '$door->knob->unturn(); $door->can_be_opened(); => '.($door->can_be_opened()?'true':'false')."\n";
$door->push();
echo '$door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
$door->knob->turn(); $door->push();
echo '$door->knob->turn(); $door->push();; $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
$door->pull();
echo '$door->pull; $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
echo '$door->can_be_opened(); => '.($door->can_be_opened()?'true':'false')."\n\n";
class DoorCloserDelay extends Threaded {
public $delay;
function __construct($delay) { $this->delay = $delay; }
function run
() { sleep($this->delay); } }
class DoorWithCloser extends Door {
public $delay;
private $thread;
private $pool;
function __construct($delay) {
parent::__construct();
$this->pool = new Pool(1);
$this->thread = new DoorCloserDelay($delay);
$this->delay = $delay;
}
function push() {
parent::push();
if ($this->thread->isRunning()) {
$this->thread->terminate();
$this->pool->shutdown();
}
$this->thread = new DoorCloserDelay($this->delay);
$this->pool->submit($this->thread);
while (!$this->thread->isRunning()) continue;
}
function is_open() {
if (!$this->thread->isRunning()) { $this->pull(); }
return parent::is_open();
}
}
echo "\$door is a DoorWithCloser...\n";
$door = new DoorWithCloser(3);
$door->is_open();
$door->knob->turn(); $door->push();
echo '$door->knob->turn(); $door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
echo '1 second after';
echo ', $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
echo '4 seconds after';
echo ', $door->is_open(); => '.($door->is_open()?'true':'false')."\n\n";
trait TDoorStopper {
function be_stoppered_on() { $this->stoppered = true; }
function be_stoppered_off() { $this->stoppered = false; }
function is_stoppered() { return $this->stoppered; }
function pull() { if (!$this->is_stoppered()) { parent::pull(); } }
function push() { $this->be_stoppered_off(); parent::push(); }
}
class DoorWithStopper extends Door {
use TDoorStopper;
protected $stoppered = false;
}
echo "\$door is a DoorWithStopper...\n";
$door = new DoorWithStopper();
$door->is_open();
$door->knob->turn(); $door->push();
echo '$door->knob->turn(); $door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
$door->be_stoppered_on(); $door->pull();
echo '$door->be_stoppered_on(); $door->pull(); $door->is_close(); =>'.($door->is_close()?'true':'false')."\n";
$door->be_stoppered_off(); $door->pull();
echo '$door->be_stoppered_off(); $door->pull(); $door->is_close(); =>'.($door->is_close()?'true':'false')."\n\n";
class DoorWithStopperCloser extends DoorWithCloser {
use TDoorStopper { TDoorStopper::be_stoppered_off as aliased_be_stoppered_off; }
protected $stoppered = false;
function push() { $this->aliased_be_stoppered_off(); parent::push(); }
function be_stoppered_off() { $this->push(); }
}
echo "\$door is a DoorWithStopperCloser...\n";
$door = new DoorWithStopperCloser(3);
$door->is_open();
$door->knob->turn(); $door->push();
echo '$door->knob->turn(); $door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
$door->be_stoppered_on();
echo '$door->be_stoppered_on(); then 4 seconds after';
echo ', $door->is_close(); => '.($door->is_close()?'true':'false')."\n";
$door->be_stoppered_off();
echo '$door->be_stoppered_off(); then 4 seconds after';
echo ', $door->is_close(); => '.($door->is_close()?'true':'false')."\n";
$door->knob->turn(); $door->push();
echo '$door->knob->turn(); $door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
$door->be_stoppered_on();
echo '$door->be_stoppered_on(); then 4 seconds after';
echo ', $door->is_close(); => '.($door->is_close()?'true':'false')."\n";
$door->push();
echo '$door->push(); then 4 seconds after';
echo ', $door->is_close(); => '.($door->is_close()?'true':'false')."\n";