在日常开发中,可能对接三方接口,比如根据根据快递单号查询快递跟踪的接口,其接口返回的值是固定的,比如
{
"code":100000,
"message":"获取成功",
"data":[
{
"time":"2020-01-01 11:00:00",
"log":"已接单"
},
......
]
}
当获取到此数据的时候,可能利用 json_decode 解序后获取对应的数组数据,而后在进行逻辑判断,但是是不是感觉不是很优雅。
能否封装到一个对象中,然后想调用对象方法一样使用它,比如 $res->code 就可以直接获取到 100000。
那么如何优雅的使用,那么就涉及到了 BaseObject。
封装
<?php
namespace app\base;
use yii\base\BaseObject;
use Exception;
class Result extends BaseObject
{
private $_code = 0;
private $_message = '';
private $_data = null;
/**
*
* @return mixed
*/
public function getCode ()
{
return $this->_code;
}
/**
*
* @return mixed
*/
public function getMessage ()
{
return $this->_message;
}
/**
*
* @return mixed
*/
public function getData ()
{
return $this->_data;
}
/**
*
* @param mixed $_code
*/
public function setCode ($_code)
{
$this->_code = $_code;
}
/**
*
* @param mixed $_message
*/
public function setMessage ($_message)
{
$this->_message = $_message;
}
/**
*
* @param mixed $_data
*/
public function setData ($_data)
{
$this->_data = $_data;
}
public static function newInstance ($json = '')
{
$decode = [];
if(! empty($json))
{
if(is_string($json))
{
$decode = json_decode($json, true);
if(empty($decode) || ! is_array($decode))
{
throw new Exception('数据格式错误');
}
}
}
$result = new Result($decode);
return $result;
}
// 是否成功
// 100000 为成功
public function isSuccess()
{
return $this->$_code == 100000;
}
public function __toString ()
{
return json_encode([
'code' => $this->getCode(),
'message' => $this->getMessage(),
'data' => $this->getData()
]);
}
}
使用
<?php
// 从json数据进行解析到 Result
$json = <<<JSON
{
"code":100000,
"message":"获取成功",
"data":[
{
"time":"2020-01-01 11:00:00",
"log":"已接单"
}
]
}
JSON;
$result = Result::newInstance($json);
var_dump($result->code, $result->message, $result->data, $result->isSuccess());