我目前正在研究一些 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 ,仅添加了 int
、float
、string
和 bool
。
您引用的错误之前曾出现过,令人困惑,尤其是在标量类型提示的上下文中。让我为您制作模板:
Argument [N] passed to [Function] must be an instance of [Class], [Type] given
之所以会出现这种困惑,是因为 PHP 允许类与所有原语的记录原语(bool
、float
等)具有相同的名称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/