$request->post(); PHP 无法区分 array 还是 object

youfeed

问题描述

使用 $request->post(); 获取全部参数
我的参数 是前端提交的json 表单,JSONRPC风格
不管你提交的是 对象还是数组 你打印出来的都是 数组类型

程序代码或配置

// 前端

Body 类型 : application/json
{
    "method": "register",
    "params": {}
}

// 后端

$post = $request->post();
return json([
    is_array($post),
    is_object($post),
    gettype($post),
    $post
]);
// 返回
[
    true,
    false,
    "array",
    {
        "method": "register",
        "params": {}
    }
]

重现问题的步骤

前端提交一个数组 和 对象 即可

操作系统环境及workerman/webman等具体版本

去看了 Request $request 也没看出所以然来,好像PHP 没有 JSONArray JSONObject 类型

705 2 0
2个回答

youfeed

这里先给一个 PHP > 8.1.0 版本的方案
使用 array_is_list 判断是数组还是对象
array_is_list($request->post())

地址function.array-is-list.php

老版本自己扩展一个 这个出来
old school polyfill (:
<?php
if (!function_exists('array_is_list')) {
    function array_is_list(array $array)
    {
        if ($array === []) {
             return true;
        }
        $keys = array_keys($array);
        return $keys === array_keys($keys);
    }
}
?>
  • 何烈山 2023-04-19

    不知道你的目的是啥。$request->post() 数据类型是数组的话,你想变成 object有很多种方式。
    array_is_list() 只是检测所给的数组是不是一个list.需要数组的第一个索引是0,然后所有的索引还必须连续。

  • youfeed 2023-04-20

    $request->post() 不管你上传的是 json->[] 还是json->{} 数据 一律都是array 是php的问题,php 不管数组还是对象,内部都是 有序映射
    它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。

何烈山

需要看一下这里:
https://github.com/walkor/workerman/blob/f0994fb9841907ea7f7c8d597f72f914a75339c0/src/Protocols/Http/Request.php#L491

if (preg_match('/\bjson\b/i', $contentType)) {
    $this->data['post'] = (array)json_decode($bodyBuffer, true);
} else {
    parse_str($bodyBuffer, $this->data['post']);
}

如果你在header 里面指明了数据类型是 json的,那么 $request->post()返回的数据类型就是array.
我感觉你是想用:

$post = $request->rawBody();
  • 暂无评论
年代过于久远,无法发表回答
🔝