<?php
    #状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类。
    //抽象状态
    abstract class State{
        public $w;
        abstract function WriteProgram($w);
    }
    
    //上午和中午工作状态类
    class ForenoonState extends State{
        function WriteProgram($w){
            if($w->Hour<12){
                echo "当前时间:".$w->Hour ."点 上午工作,精神百倍";
            }else{
                $w->SetState(new NoonState());
                $w->WriteProgram();
            }
        }
    }
    
    //中午工作状态
    class NoonState extends State{
        public function WriteProgram($w){
            if($w->Hour<13){
                echo "当前时间:".$w->Hour ."点 饿了,午饭;犯困,午休。";
            }else{
                $w->setState(new AfternoonState());
                $w->WriteProgram();
            }
        }
    }
    
    //下午工作状态
    class AfternoonState extends State{
        public function WriteProgram($w){
            if($w->Hour<17){
                echo '当前时间:'.$w->Hour ."点 下午状态还不错,继续努力";
            }else{
                $w->SetState(new EveningState());
                $w->WiteProgram();
            }
        }
    
    }
    
    //晚间工作状态
    class EveningState extends State{
        public function WriteProgram($w){
            if($w->TaskFinished){//工作完成时
                $w->SetState(new RestState());
                $w->WriteProgram();
            }else{
                if($w->Hour<21){
                    echo "当前时间".$w->Hour ."点 加班哦,疲累之极";
                }else{
                    $w->SetState(new SleepingState());
                    $w->WriteProgram();
                }
            }
        }
    }
    
    //睡眠状态和下班休息状态
    //睡眠状态
    class SleepingState extends State
    {
        public function WriteProgram($w){
            echo "当前时间:".$w->Hour."点不行了,睡着了";
        }
    }
    
    //下班休息状态
    class RestState extends State{
        public function WriteProgram($w){
            echo "当前时间:".$w->Hour ."点下班回家了";
        }
    }
    
    //工作类
    class Work{
        private $current;
        private $Hour;
        private $finish = false;
        
        public function __construct(){
            $this->current = new ForenoonState();
        }
        
        public function __get($Hour){
            return $this->$Hour;
        }
        
        public function __set($param,$val){
            $this->$param = $val;
        
        }
        
        public function SetState($s){
            $this->current = $s;
        }
        
        public function WriteProgram(){
            $this->current->WriteProgram($this);
        }
    }
    
    
    //客户端代码
    //紧急项目
    $work = new Work();
    $work->Hour = 9;
    $work->WriteProgram();
    $work->Hour = 15;
    $work->WriteProgram();
?>