php - 文件句柄作为函数参数的类型提示

标签 php

我目前正在研究一些 PHP 代码,并试图使其更新。我找到了一个函数,它可以检索文件句柄(通过 fopen)。

返回类型是stream。我检查了

$handle = fopen("myfile.csv", "r");
var_dump(get_resource_type($handle));

如上所述,类型似乎是stream

当我尝试将此对象传递给函数时,我无法使用流强制类型。

public function parseHandle(stream $handle){}

最终出现以下错误消息:

Argument 1 passed to parseHandle must be an instance of stream, resource given.

当我尝试将签名更改为function parseHandle(resource $resource)时,会产生以下错误:

Argument 1 passed to parseHandle must be an instance of resource, resource given

正确的数据类型是什么?我应该如何在参数中使用它?

我知道我可以在函数的第一行中使用 is_resource 来验证它,但我仍然想知道。

最佳答案

不幸的是,您不能使用原始类型resource作为类型提示。 PHP 的最新类型提示系统更改为 scalar type hints ,仅添加了 intfloatstringbool

您引用的错误之前曾出现过,令人困惑,尤其是在标量类型提示的上下文中。让我为您制作模板:

Argument [N] passed to [Function] must be an instance of [Class], [Type] given

之所以会出现这种困惑,是因为 PHP 允许类与所有原语的记录原语(boolfloat 等)具有相同的名称PHP 7 之前,以及 PHP 7 及更高版本中的一些 。因此,当您说 stream $handle 时,PHP 期望 $handle 属于 class stream。同样,resource $handle 期望 $handle 属于 resource 类。

如果您想输入提示资源,我建议使用 \SplFileObject:

$handle = new \SplFileObject('myfile.csv', 'r');
function parseHandle(\SplFileObject $handle) { ... }

这不是世界上最好的事情,因为\SplFileObject 有一些怪癖,但归根结底,如果你想在 PHP 中输​​入提示,你必须有一个数组、一个标量,或者一个类。

关于php - 文件句柄作为函数参数的类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40637939/

相关文章:

php - CodeIgniter 中的 301 重定向有 ?问题

php - 用于搜索用户 token (技能)的 SQL 查询

php - 在 cake PHP 中使用服务器发送的事件

php - 在 linux 中使用 inotify 在 php 中读取文件

php - 使用 Codeigniter 闭包表显示分层数据

php - 添加一个 div 阅读更多 wordpress

PHP PDO 未锁定 MySQL 表

php - 无法在 PHP 中的字符串中添加空格

php - 如何回显数组中的项目数?

php - 如何检测页面是否为 RSS 或 ATOM 提要