Encapsulate varying behavior for the same routine based on an object's state. This can be a cleaner way for an object to change its behavior at runtime without resorting to large monolithic conditional statements.
You can also find this code on GitHub
OrderContext.php
.. literalinclude:: OrderContext.php :language: php :linenos:
State.php
.. literalinclude:: State.php :language: php :linenos:
StateCreated.php
.. literalinclude:: StateCreated.php :language: php :linenos:
StateShipped.php
.. literalinclude:: StateShipped.php :language: php :linenos:
StateDone.php
.. literalinclude:: StateDone.php :language: php :linenos:
Tests/StateTest.php
.. literalinclude:: Tests/StateTest.php :language: php :linenos: