<?php /** * 状态模式 * 容许一个实例在内部修改状态行为 * */ /** * Class state * 状态类 抽象 */ abstract class AState { abstract function handle(Context $context); } /** * Class StateA * 抽象状态实例A */ class StateA extends AState { // 保存自身实例 private static $_examples; private function __construct() { // echo '实例自动构造函数A' . PHP_EOL; } private function __clone() { // echo '实例自动析构函数A' . PHP_EOL; // TODO: Implement __clone() method. } public static function Examples() { // 获取自身实例 if (!isset(self::$_examples)) { self::$_examples = new self; } return self::$_examples; } function Handle(Context $context) { // TODO: Implement handle() method. echo 'stateA' . PHP_EOL; $context->ChangeState(StateB::Examples()); } } /** * Class StateB * 抽象状态B */ class StateB extends AState { // 保存自身实例 private static $_examples; private function __construct() { // echo '实例自动构造函数B' . PHP_EOL; } private function __clone() { // echo '实例自动析构函数B' . PHP_EOL; // TODO: Implement __clone() method. } public static function Examples() { // 获取自身实例 if (!isset(self::$_examples)) { self::$_examples = new self; } return self::$_examples; } // Handle 状态实例转跳 function Handle(Context $context) { // TODO: Implement handle() method. echo 'stateB' . PHP_EOL; $context->ChangeState(StateA::Examples()); } } /** * Class context * 上下文,环境内容 * 状态保存类 */ class Context { protected $state; public function __construct(AState $AState) { // 初始状态 保存 $this->state = $AState; } // 修改状态 public function ChangeState(AState $AState) { $this->state = $AState; } public function Handle() { // 调用保存实例的Handle $this->state->Handle($this); } public function Request() { $this->state->Handle($this); } } $context = new Context(StateB::Examples()); $context->Request(); // stateB $context->Request(); // stateA $context->Request(); // stateB