函数调用 – 永夜 https://www.shuijingwanwq.com 没有不值得去解决的问题,也没有不值得去学习的技术! Mon, 22 May 2023 02:08:27 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 在 PHP 7.4 中报错:header() expects at least 1 parameter, 0 given (is_callable(‘Header’) 为 true) https://www.shuijingwanwq.com/2023/05/22/7650/ https://www.shuijingwanwq.com/2023/05/22/7650/#respond Mon, 22 May 2023 02:08:27 +0000 https://www.shuijingwanwq.com/?p=7650 浏览量: 105 1、在 PHP 7.4 中报错:header() expects at least 1 parameter, 0 given。如图1
在 PHP 7.4 中报错:header() expects at least 1 parameter, 0 given

图1



{
  "errors": [
    {
      "debugMessage": "header() expects at least 1 parameter, 0 given",
      "message": "Internal server error",
      "extensions": {
        "category": "internal"
      },
      "locations": [
        {
          "line": 5,
          "column": 7
        }
      ],
      "path": [
        "onlineStoreSession",
        "versionedOnlineStore",
        "theme"
      ],
      "trace": [
        {
          "file": "E:\\wwwroot\\object\\Modules\\OnlineStoreThemeGraphQl\\Resolver\\OnlineStoreThemeResolver.php",
          "line": 96,
          "function": "header()"
        },
        {
          "call": "Modules\\OnlineStoreThemeGraphQl\\Resolver\\OnlineStoreThemeResolver::Modules\\OnlineStoreThemeGraphQl\\Resolver\\{closure}(array(4), 'name')"
        }
      ]
    }
  ],
  "data": {
    "onlineStoreSession": {
      "versionedOnlineStore": {
        "theme": null
      }
    }
  }
}


2、查看具体的代码实现


        $fields = array_keys($resolveInfo->getFieldSelection());

        return  array_reduce($fields, function($carry, $field) use($fieldResolvers){
            if (isset($fieldResolvers[$field])) {
                $carry[$field] = is_callable($fieldResolvers[$field])? $fieldResolvers[$field](): $fieldResolvers[$field];
            }

            return $carry;
        }, []);


3、打印 $fields ,结果如下


$fields = array_keys($resolveInfo->getFieldSelection());
print_r($fields);
exit;




Array
(
    [0] => id
    [1] => editable
    [2] => createdAt
    [3] => editedAt
    [4] => name
    [5] => role
    [6] => previewable
    [7] => url
    [8] => themeStoreThemeId
    [9] => metadata
    [10] => presets
    [11] => themeSettingsCategories
)



4、添加判断,当 $field 等于 name 时,打印 $fieldResolvers[$field]、is_callable($fieldResolvers[$field])


        $fields = array_keys($resolveInfo->getFieldSelection());

        return  array_reduce($fields, function($carry, $field) use($fieldResolvers){

            if (isset($fieldResolvers[$field])) {
                if ($field == 'name') {
                    var_dump($fieldResolvers[$field]);
                    var_dump(is_callable($fieldResolvers[$field]));
                    exit;
                }
                $carry[$field] = is_callable($fieldResolvers[$field])? $fieldResolvers[$field](): $fieldResolvers[$field];
            }

            return $carry;
        }, []);




string(6) "Header"
bool(true)


5、is_callable — 验证值是否可以在当前范围内作为函数调用。is_callable(‘Header’) 为 true,因为调用了 header() — 发送原生 HTTP 头,参数是必填的,进而报错。instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例。Closure 用于代表 匿名函数 的类。调整为 $fieldResolvers[$field] instanceof \Closure 后,不再报错。


        $fields = array_keys($resolveInfo->getFieldSelection());

        return  array_reduce($fields, function($carry, $field) use($fieldResolvers){
            if (isset($fieldResolvers[$field])) {
                $carry[$field] = ($fieldResolvers[$field] instanceof \Closure) ? $fieldResolvers[$field](): $fieldResolvers[$field];
            }

            return $carry;
        }, []);


]]>
https://www.shuijingwanwq.com/2023/05/22/7650/feed/ 0