没有不值得去解决的问题,也没有不值得去学习的技术!

PHP 7.4 Error: header() expects at least 1 parameter, 0 given (is_callable(‘Header’) returns true)

Error in PHP 7.4: header() expects at least 1 parameter, 0 given

1. In PHP 7.4, an error occurs: header() expects at least 1 parameter, 0 given. As shown in Figure 1.

Error in PHP 7.4: header() expects at least 1 parameter, 0 given
Figure 1
JSON

{
  "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. Review the specific code implementation.

PHP

        $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. Print $fields, the result is as follows.

PHP

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

Plaintext

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. Add a condition: when $field equals name, print $fieldResolvers[$field] and is_callable($fieldResolvers[$field]).

PHP

        $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;
        }, []);

Plaintext

string(6) "Header"
bool(true)

5. is_callable — verifies whether a value can be called as a function from the current scope. is_callable(‘Header’) returns true, which triggers the native header() function — Send a raw HTTP header — and since its parameters are required, an error is thrown. instanceof is used to determine whether a PHP variable is an instantiated object of a certain class. Closure is the class used to represent anonymous functions. After changing the check to $fieldResolvers[$field] instanceof \Closure, the error no longer occurs.

PHP

        $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;
        }, []);

关于作者 · 持续学习与技术实践

我是一名拥有 15 年以上开发经验的技术从业者,自 2013 年起持续运营个人技术博客,记录工作与个人项目中遇到的真实问题,以及解决问题过程中的探索、实践和思考。

除了技术写作,我也在持续开发和维护自己的独立项目,探索新技术和新工具在实际场景中的应用。我始终相信,没有不值得去解决的问题,也没有不值得去学习的技术。

如果这篇文章对你有所帮助,欢迎浏览博客中的其他文章,也欢迎交流技术经验与想法。

关于我  ·  GitHub  ·  邮件联系