value = []; } /** * 从原始数据尝试创建消息 * @param string $buffer 待解析的数据,成功后会修改该数据的内容 * @return Message|false 成功返回消息对象,失败返回false */ public static function parse(&$buffer) { $len = strlen($buffer); if ($len < 4) { return false; } $arr = unpack('N', substr($buffer, 0, 4)); $datalen = $arr[1]; if ($datalen > self::MAX_SIZE) { return false; } if ($len < $datalen + 4) { return false; } $body = substr($buffer, 4, $datalen); $buffer = substr($buffer, 4 + $datalen); $msg = new self(); $msg->set(json_decode($body, true)); return $msg; } /** * 取数据 * @param string $key 要取的字段名 * @return mixed 字段的值 */ public function get($key = '') { return empty($key) ? $this->value : (is_array($this->value) && isset($this->value[$key]) ? $this->value[$key] : null); } /** * 设置数据 * @param string|mixed $key 要设置的字段名,或完整的数据数组 * @param mixed $value 要设置的值 */ public function set($key, $value = null) { if ($value === null) { $this->value = $key; } elseif (is_array($this->value)) { $this->value[$key] = $value; } else { $this->value = [$key => $value]; } } /** * 将保存的数据转成原始数据 * @return string 数据 */ public function toBuffer() { $buffer = empty($this->value) ? '' : json_encode($this->value); return pack('N', strlen($buffer)) . $buffer; } }