引言
我们常说PHP就是 数组 一把梭,因为数组在程序内所占的比重和地位实在太重要。今天我们就来说一说在API接口编程中经常会遇到的,特别是对接强类型的语言时, 如何保证接口数据结构和类型的稳定性。
学习时间
PHP的数组有关联数组,和序列化数组之分。在很多场景下,返回的数组经过二次操作, 结构都有可能发生较大的改变。这时候能不能保证返回数据的稳定,很考验PHPer们的基础水平。
比如一个接口正常返回的,是一个关联数组,都有明确指定的键值对,这个时候基本不会出错。但如果在程序上下文中,需要返回错误信息,假如我们指定下面的格式:
$data = array('code' => 30009, 'msg' => 'invalid paramater');
很显然这是一个关联数组,在laravel程序中,手动构建一个json字符串的输出:
return response()->json($data);
那么经过请求后返回的数据是下面这样的json格式的字符串:
{"code":30009,"msg":"invalid paramater"}
假设我们正常返回了数据,且数据是关联数组,类似下面这种方式:
$list = array(
'name' => 'joe',
'age' => 21,
);
然后我们组装起来为接口准备数据:
$data = array(
'code' => 0,
'msg' => 'ok',
'list' => $list,
);
大家请注意,我们已经使用了嵌套数组,$data['list'] 就是。接着仍然构造响应体:
return response()->json($data);
请求接口后返回的数据格式如下:
{"code":0,"msg":"ok","list":{"name":"joe","age":21}}
那么我们现在要把上面的格式固定下来,$data['list'] 始终需要返回一个关联的数组,或者说是一个 json 格式中的 对象。也就是当 $list 没有值的时候,我们仍然保持上面的格式,应该怎么办呢?
其实,只需要一个空对象就可以了。在PHP中构造一个空对象,有一个简单的做法,就是
new \stdClass();
创建一个这样的对象,没有属性,没有方法,没有任何数据。但是怎么把空对象,转换为JSON格式的字符串呢?我们应该使用下面的方式:
$list = json_encode(new \stdClass);
然后返回其他数据不变,请求后的返回数据如下:
{"code":0,"msg":"ok","list":"{}"}
PHP动态语言很好地提供了灵活的语言数据类型,所以我们还有很多种方式可用。比如使用强制数据类型转换, 在手册中明确说明了,对于 null,使用 object 数据类型格式化后,会返回空对象。所以上面的赋值操作也可以这样写:
$list = (object) null;
当然结果是一样的。
如果你不厌烦曲线救国的方法,也可以像下面这样写。
$list = json_encode(json_decode("{}"));
对于json中的空对象 {} ,可以先解码后编码,结果是一样的。
写在最后
本文通过三种方式实现了laravel响应体中手动构建一个json空对象的方法。大家可以根据实际情况,进行灵活选用。不过要稳妥,还是推荐使用第一种方法, 手动创建 stdClass 对象,然后使用 json_encode 编码。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货