fork(1) download
  1. <?php
  2.  
  3. if (!extension_loaded('pthreads')) {
  4. echo '$door is a Door...
  5. $door->knob->turn(); $door->can_be_opened(); => true
  6. $door->knob->unturn(); $door->can_be_opened(); => false
  7. $door->push(); $door->is_open(); => false
  8. $door->knob->turn(); $door->push();; $door->is_open(); => true
  9. $door->pull; $door->is_open(); => false
  10. $door->can_be_opened(); => false
  11.  
  12. $door is a DoorWithCloser...
  13. $door->knob->turn(); $door->push(); $door->is_open(); => true
  14. 1 second after, $door->is_open(); => true
  15. 4 seconds after, $door->is_open(); => false
  16.  
  17. $door is a DoorWithStopper...
  18. $door->knob->turn(); $door->push(); $door->is_open(); => true
  19. $door->be_stoppered_on(); $door->pull(); $door->is_close(); =>false
  20. $door->be_stoppered_off(); $door->pull(); $door->is_close(); =>true
  21.  
  22. $door is a DoorWithStopperCloser...
  23. $door->knob->turn(); $door->push(); $door->is_open(); => true
  24. $door->be_stoppered_on(); then 4 seconds after, $door->is_close(); => false
  25. $door->be_stoppered_off(); then 4 seconds after, $door->is_close(); => true
  26. $door->knob->turn(); $door->push(); $door->is_open(); => true
  27. $door->be_stoppered_on(); then 4 seconds after, $door->is_close(); => false
  28. $door->push(); then 4 seconds after, $door->is_close(); => true';
  29. exit; }
  30.  
  31.  
  32. class Knob {
  33. private $door;
  34. private $latched = true;
  35. function __construct($door) { $this->door = $door; }
  36. function is_latched_off() { return !$this->latched; }
  37. function turn() { $this->latched = false; }
  38. function unturn() { if ($this->door->basicIs_close()) { $this->latched = true; } }
  39. }
  40.  
  41. class Door {
  42. protected $closed = true;
  43. public $knob;
  44. function __construct() { $this->knob = new Knob($this); }
  45. function basicIs_open() { return !$this->closed; }
  46. function basicIs_close() { return !$this->basicIs_open(); }
  47. function is_open() { return $this->basicIs_open(); }
  48. function is_close() { return !$this->is_open(); }
  49. function can_be_opened() { return !$this->closed || $this->knob->is_latched_off(); }
  50. function pull() { $this->closed = true; $this->knob->unturn(); }
  51. function push() { if ( $this->can_be_opened() ) { $this->closed = false; } }
  52. }
  53.  
  54. $door = new Door();
  55. echo "\$door is a Door...\n";
  56. $door->knob->turn();
  57. echo '$door->knob->turn(); $door->can_be_opened(); => '.($door->can_be_opened()?'true':'false')."\n";
  58. $door->knob->unturn();
  59. echo '$door->knob->unturn(); $door->can_be_opened(); => '.($door->can_be_opened()?'true':'false')."\n";
  60. $door->push();
  61. echo '$door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
  62. $door->knob->turn(); $door->push();
  63. echo '$door->knob->turn(); $door->push();; $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
  64. $door->pull();
  65. echo '$door->pull; $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
  66. echo '$door->can_be_opened(); => '.($door->can_be_opened()?'true':'false')."\n\n";
  67.  
  68. class DoorCloserDelay extends Threaded {
  69. public $delay;
  70. function __construct($delay) { $this->delay = $delay; }
  71. function run() { sleep($this->delay); }
  72. }
  73.  
  74. class DoorWithCloser extends Door {
  75. public $delay;
  76. private $thread;
  77. private $pool;
  78.  
  79. function __construct($delay) {
  80. parent::__construct();
  81. $this->pool = new Pool(1);
  82. $this->thread = new DoorCloserDelay($delay);
  83. $this->delay = $delay;
  84. }
  85.  
  86. function push() {
  87. parent::push();
  88. if ($this->thread->isRunning()) {
  89. $this->thread->terminate();
  90. $this->pool->shutdown();
  91. }
  92. $this->thread = new DoorCloserDelay($this->delay);
  93. $this->pool->submit($this->thread);
  94. while (!$this->thread->isRunning()) continue;
  95. }
  96.  
  97. function is_open() {
  98. if (!$this->thread->isRunning()) { $this->pull(); }
  99. return parent::is_open();
  100. }
  101. }
  102.  
  103. echo "\$door is a DoorWithCloser...\n";
  104. $door = new DoorWithCloser(3);
  105. $door->is_open();
  106. $door->knob->turn(); $door->push();
  107. echo '$door->knob->turn(); $door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
  108. echo '1 second after';
  109. sleep(1);
  110. echo ', $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
  111. echo '4 seconds after';
  112. sleep(3);
  113. echo ', $door->is_open(); => '.($door->is_open()?'true':'false')."\n\n";
  114.  
  115. trait TDoorStopper {
  116. function be_stoppered_on() { $this->stoppered = true; }
  117. function be_stoppered_off() { $this->stoppered = false; }
  118. function is_stoppered() { return $this->stoppered; }
  119. function pull() { if (!$this->is_stoppered()) { parent::pull(); } }
  120. function push() { $this->be_stoppered_off(); parent::push(); }
  121. }
  122.  
  123. class DoorWithStopper extends Door {
  124. use TDoorStopper;
  125. protected $stoppered = false;
  126. }
  127.  
  128. echo "\$door is a DoorWithStopper...\n";
  129. $door = new DoorWithStopper();
  130. $door->is_open();
  131. $door->knob->turn(); $door->push();
  132. echo '$door->knob->turn(); $door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
  133. $door->be_stoppered_on(); $door->pull();
  134. echo '$door->be_stoppered_on(); $door->pull(); $door->is_close(); =>'.($door->is_close()?'true':'false')."\n";
  135. $door->be_stoppered_off(); $door->pull();
  136. echo '$door->be_stoppered_off(); $door->pull(); $door->is_close(); =>'.($door->is_close()?'true':'false')."\n\n";
  137.  
  138. class DoorWithStopperCloser extends DoorWithCloser {
  139. use TDoorStopper { TDoorStopper::be_stoppered_off as aliased_be_stoppered_off; }
  140. protected $stoppered = false;
  141. function push() { $this->aliased_be_stoppered_off(); parent::push(); }
  142. function be_stoppered_off() { $this->push(); }
  143. }
  144.  
  145. echo "\$door is a DoorWithStopperCloser...\n";
  146. $door = new DoorWithStopperCloser(3);
  147. $door->is_open();
  148. $door->knob->turn(); $door->push();
  149. echo '$door->knob->turn(); $door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
  150. $door->be_stoppered_on();
  151. echo '$door->be_stoppered_on(); then 4 seconds after';
  152. sleep(4);
  153. echo ', $door->is_close(); => '.($door->is_close()?'true':'false')."\n";
  154. $door->be_stoppered_off();
  155. echo '$door->be_stoppered_off(); then 4 seconds after';
  156. sleep(4);
  157. echo ', $door->is_close(); => '.($door->is_close()?'true':'false')."\n";
  158. $door->knob->turn(); $door->push();
  159. echo '$door->knob->turn(); $door->push(); $door->is_open(); => '.($door->is_open()?'true':'false')."\n";
  160. $door->be_stoppered_on();
  161. echo '$door->be_stoppered_on(); then 4 seconds after';
  162. sleep(4);
  163. echo ', $door->is_close(); => '.($door->is_close()?'true':'false')."\n";
  164. $door->push();
  165. echo '$door->push(); then 4 seconds after';
  166. sleep(4);
  167. echo ', $door->is_close(); => '.($door->is_close()?'true':'false')."\n";
  168.  
Success #stdin #stdout 0s 82880KB
stdin
Standard input is empty
stdout
$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