我目前正在研究一些 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 ,仅添加了 int
、 float
、 string
和 bool
。
您引用的错误之前出现过令人困惑,尤其是在标量类型提示的上下文中。让我为您设计模板:
之所以会产生混淆,是因为 PHP 7 之前的所有原语以及 PHP 7 和更高版本的 中的某些原语,PHP 允许类具有与文档原语( bool
、 float
等)相同的名称。因此,当您说 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/