国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

$request->post(); PHP 無法區(qū)分 array 還是 object

youfeed

問題描述

使用 $request->post(); 獲取全部參數(shù)
我的參數(shù) 是前端提交的json 表單,JSONRPC風(fēng)格
不管你提交的是 對象還是數(shù)組 你打印出來的都是 數(shù)組類型

程序代碼或配置

// 前端

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": {}
    }
]

重現(xiàn)問題的步驟

前端提交一個數(shù)組 和 對象 即可

操作系統(tǒng)環(huán)境及workerman/webman等具體版本

去看了 Request $request 也沒看出所以然來,好像PHP 沒有 JSONArray JSONObject 類型

1294 2 0
2個回答

youfeed

這里先給一個 PHP > 8.1.0 版本的方案
使用 array_is_list 判斷是數(shù)組還是對象
array_is_list($request->post())

地址function.array-is-list.php

老版本自己擴(kuò)展一個 這個出來
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() 數(shù)據(jù)類型是數(shù)組的話,你想變成 object有很多種方式。
    array_is_list() 只是檢測所給的數(shù)組是不是一個list.需要數(shù)組的第一個索引是0,然后所有的索引還必須連續(xù)。

  • youfeed 2023-04-20

    $request->post() 不管你上傳的是 json->[] 還是json->{} 數(shù)據(jù) 一律都是array 是php的問題,php 不管數(shù)組還是對象,內(nèi)部都是 有序映射
    它可以被視為數(shù)組、列表(向量)、哈希表(映射的實(shí)現(xiàn))、字典、集合、堆棧、隊(duì)列等等。

何烈山

需要看一下這里:
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 里面指明了數(shù)據(jù)類型是 json的,那么 $request->post()返回的數(shù)據(jù)類型就是array.
我感覺你是想用:

$post = $request->rawBody();
  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??