<?php

namespace loyalsoft;

/**
 * Description of Req
 * 客户端数据请求实体
 * @author jgao
 */
class Req extends Object_ext {

    /**
     * 谁(openId)
     * @var String
     */
    public $uid;

    /**
     * 对哪个功能
     * @var int
     */
    public $ope;

    /**
     * 执行什么操作
     * @var int
     */
    public $cmd;

    /**
     * 数据体[数组]
     * @var array
     */
    public $paras;

    /**
     * 时间戳
     * @var int
     */
    public $ts;

    /**
     * 分区id
     * @var string
     */
    public $zoneid;

// <editor-fold defaultstate="collapsed" desc=" 服务端为了便于操作使用到的变量直接挂载到req上 ">

    /**
     * 挂载玩家数据实体
     * @var UserInfoMo
     */
    public $userInfo;

    /**
     * @var bool userInfo是否需要回写
     */
    public $userInfoChanged = false;

// </editor-fold> 

    /**
     * @param Req $req
     * @return Req
     */
    public function __construct($req) {
        if (is_string($req)) {                                                  // fix黑窗调试直接调用
            $req = JsonUtil::decode($req);
        }
        parent::__construct($req);
        switch ($this->cmd) {
            case CmdCode::cmd_user_loginuserinfo :                              # 登录
            case CmdCode::cmd_user_gameconstinfo :                              # 下载常量
            case CmdCode::cmd_user_testUserLogin :                              # 测试登录
            case CmdCode::cmd_user_registerNewUID :                             # 测试注册账号
            case CmdCode::cmd_user_registerNewRole :                            # 测试注册角色
            case CmdCode::cmd_user_getzonelist:                                 # 下载分区列表
                # 这些消息不需要初始化UserInfo
                break;
            default :                                                           # 其余消息，初始化UserInfo
                if ($this->uid) {
                    $this->userInfo = UserProc::getUserInfo($this->zoneid, $this->uid);
                    if (null == $this->userInfo) {
                        Err(">>>>>>>>>>用户数据读取为空!!<<<<<<<<<<<[$this->uid]:PreProc");
                    }
                }
                break;
        }
        self::$_req = $this; // ---赋值---
    }

    /**
     * 把Req对象序列化到字符串
     * @return type
     */
    public function __toString() {
        $clone = clone $this;
        unset($clone->userInfo);                                                # 删除不必要的字段
        unset($clone->userInfoChanged);                                         # 删除不必要的字段 
        $str = JsonUtil::encode($clone);                                        # json
        return $str;
    }

    // <editor-fold defaultstate="collapsed" desc="单例：想着以后不在通过函数透传此对象了">

    /**
     * 全局实例
     * @return Req
     */
    public static function Ins() {
        return self::$_req;
    }

    private static $_req;

// </editor-fold>
}
