在函数

时间:2016-11-16 16:59:24

标签: php

我正在调查一些PHP代码,我正在尝试让它更新。我找到了一个函数,它检索文件句柄(通过fopen)。

返回类型为stream。我用

检查了一下
$handle = fopen("myfile.csv", "r");
var_dump(get_resource_type($handle));

如上所述,类型似乎是stream

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

public function parseHandle(stream $handle){}

最终出现此错误消息:

  

传递给parseHandle的参数1必须是stream的实例,给定资源。

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

  

传递给parseHandle的参数1必须是资源的实例,资源给定

什么是正确的数据类型以及如何在参数中使用它?

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

2 个答案:

答案 0 :(得分:4)

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

您引用的错误之前已经出现混淆,特别是在标量类型提示的上下文中。让我为你模板:

  

传递给[Function]的参数[N]必须是[Class]的实例,[Type]给出

出现混淆是因为PHP允许类与PHP之前的所有原语具有与记录的原语(boolfloat等)相同的名称,并且一些在PHP 7及更高版本 。所以当你说stream $handle PHP希望$handle属于类stream时。同样,resource $handle期望$handle属于resource类。

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

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

这不是世界上最好的东西,因为\ SplFileObject有一些怪癖,但在一天结束时,如果你想在PHP中输入提示,你必须有一个数组,一个标量,或者一堂课。

答案 1 :(得分:0)

对资源进行类型检查的一种方法是将其作为函数/方法中的第一条语句进行。

m==M

SPL异常:InvalidArgumentException