Ich hab mal das State Class Pattern, für welches es viele Beispiele in Java gibt in PHP nachgebaut.

Als Beispiel den beliebten Kaugummiautomaten mit ganzen 3 verschiedenen Zuständen (States) und 3 Übergängen (Actions).

Zustände sind vorhanden: "NoQuarter" (Kein Geld eingeworfen), "HasQuarter" (Geld eingeworfen) und "OutOfGumballs" (Keine Kaugummis mehr vorhanden).
Übergänge sind: "insertQuarter" (Geld einwerfen), "returnQuarter" (Geld zurückgeben) und "turnCrank" (Kaugummi ziehen).

In Php sieht das dann folgendermaßen aus:

PHP:
  1. <?php
  2. class GumballMachine { 
  3.     public $currentState;   
  4.     public $numberOfGumballs=5;
  5.     public function refill($newGumballs) {
  6.         $this->numberOfGumballs=$newGumballs;
  7.         $this->currentState=new NoQuarter();
  8.     }
  9.     public function GumballMachine() {
  10.         $this->currentState=new NoQuarter();
  11.         $this->numberOfGumballs=5;
  12.     }   
  13.     public function insertQuarter() {      
  14.         $this->currentState->insertQuarter($this);
  15.     }
  16.     public function turnCrank() {
  17.         $this->currentState->turnCrank($this);
  18.     }   
  19.     public function returnQuarter() {
  20.         $this->currentState->returnQuarter($this);
  21.     }
  22. }
  23.  
  24. // unsere Abstrakte Zustandsklasse,
  25. // da wir diese Erweitern gehen wir sicher
  26. // das alle nötigen Übergänge implementiert werden.
  27. abstract class GumballState {
  28.     public function insertQuarter($machine) {}
  29.     public function turnCrank($machine) {} 
  30.     public function returnQuarter($machine) {}
  31.     public function __call($one, $two) {
  32.         echo 'Dieser Aufruf ist aus dem
  33.               aktuellen Zustand nicht erlaubt'."\n";       
  34.     }   
  35. }
  36.  
  37. // Der State NoQuarter
  38. // hier wird auf die einzelnen Übergänge reagiert
  39. class NoQuarter extends GumballState {
  40.     public function insertQuarter(GumballMachine $machine) {
  41.         echo 'Geldstück wurde eingeworfen, Danke'."\n";
  42.         // Status auf HasQuarter setzen
  43.         $machine->currentState=new HasQuarter();
  44.     }
  45.     public function returnQuarter(GumballMachine $machine) {
  46.         echo 'Kein Geldstück eingeworfen'."\n";
  47.     }
  48.     public function turnCrank(GumballMachine $machine) {
  49.         echo 'Bitte zuerst Geldstück einwerfen.'."\n";
  50.     }   
  51.     public function __call($one, $two) {
  52.         echo 'Dieser Aufruf ist aus dem aktuellen
  53.               Zustand nicht erlaubt'."\n";   
  54.     }
  55. }
  56.  
  57. class HasQuarter extends GumballState {
  58.     public function insertQuarter(GumballMachine $machine) {
  59.         echo 'Es wurde bereits ein Geldstück eingeworfen'."\n";
  60.     }
  61.     public function returnQuarter(GumballMachine $machine) {
  62.         echo 'Geldstück wird zurückgegeben'."\n";
  63.         // Status auf NoQuarter setzen
  64.         $machine->currentState=new NoQuarter();
  65.     }
  66.     public function turnCrank(GumballMachine $machine) {
  67.         echo 'Kaugummi wird ausgegeben.'."\n";
  68.         if($machine->numberOfGumballs<=1)
  69.             $machine->currentState=new OutOfGumballs();
  70.         else {
  71.             $machine->numberOfGumballs--;
  72.             $machine->currentState=new NoQuarter();
  73.         }
  74.     }      
  75.     public function __call($one, $two) {
  76.         echo 'Dieser Aufruf ist aus dem
  77.              aktuellen Zustand nicht erlaubt'."\n";  
  78.     }
  79. }
  80.  
  81. class OutOfGumballs extends GumballState { 
  82.     public function __call($one, $two) {
  83.         echo 'Dieser Aufruf ist aus dem
  84.                 aktuellen Zustand nicht erlaubt'."\n";   
  85.     }
  86.     public function insertQuarter(GumballMachine $machine) {
  87.         echo 'Keine Kaugummis vorhanden, Automat ist leer'."\n";
  88.     }
  89.     public function turnCrank(GumballMachine $machine) {
  90.         echo 'Keine Kaugummis vorhanden, Automat ist leer'."\n";
  91.     }
  92.     public function returnQuarter(GumballMachine $machine) {
  93.         echo 'Kein Geldstück eingeworfen'."\n";
  94.     }
  95. }
  96. ?>
  97. <pre>
  98. <?php
  99. // Test des Kaugummi Automaten
  100. $oGumballMachine=new GumballMachine();
  101. $oGumballMachine->insertQuarter();
  102. $oGumballMachine->turnCrank();
  103. $oGumballMachine->turnCrank();
  104. $oGumballMachine->insertQuarter();
  105. $oGumballMachine->insertQuarter();
  106. $oGumballMachine->turnCrank();
  107. $oGumballMachine->returnQuarter();
  108. $oGumballMachine->insertQuarter();
  109. $oGumballMachine->returnQuarter();
  110. $oGumballMachine->insertQuarter();
  111. $oGumballMachine->turnCrank();
  112. $oGumballMachine->insertQuarter();
  113. $oGumballMachine->turnCrank();
  114. $oGumballMachine->insertQuarter();
  115. $oGumballMachine->turnCrank();
  116. $oGumballMachine->insertQuarter();
  117. $oGumballMachine->turnCrank();
  118. $oGumballMachine->insertQuarter();
  119. $oGumballMachine->turnCrank();
  120. // anscheinend gibts keine Kaugummis mehr
  121. // Service Techniker kommt und füllt Automat nach...
  122. $oGumballMachine->insertQuarter();
  123. $oGumballMachine->refill(5);
  124.  
  125. $oGumballMachine->insertQuarter();
  126. $oGumballMachine->turnCrank();
  127. $oGumballMachine->insertQuarter();
  128. $oGumballMachine->turnCrank();
  129. ?></pre>