我正在调查一些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
来验证它,但我仍然想知道。
答案 0 :(得分:4)
不幸的是,您不能使用基本类型resource
作为类型提示。最新类型提示系统更改为PHP scalar type hints,仅添加了int
,float
,string
和bool
。
您引用的错误之前已经出现混淆,特别是在标量类型提示的上下文中。让我为你模板:
传递给[Function]的参数[N]必须是[Class]的实例,[Type]给出
出现混淆是因为PHP允许类与PHP之前的所有原语具有与记录的原语(bool
,float
等)相同的名称,并且一些在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)