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
OrderContext.php
State.php
State.php
StateCreated.php
StateCreated.php
StateShipped.php
StateShipped.php
StateDone.php
StateDone.php
Tests/StateTest.php
Tests/StateTest.php