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

返回类型是 stream 。我检查过

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

如前所述,类型似乎是 stream

当我尝试将此对象传递给函数时,我无法使用流强制类型。
public function parseHandle(stream $handle){}

最终出现此错误消息:



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



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

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

最佳答案

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

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



之所以会产生混淆,是因为 PHP 7 之前的所有原语以及 PHP 7 和更高版本的 中的某些原语,PHP 允许类具有与文档原语( boolfloat 等)相同的名称。因此,当您说 stream $handle 时,PHP 期望 $handle 属于 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/

10-14 14:46
查看更多