2016-11-16 123 views
2

我目前正在研究一些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來驗證它,但我仍然懷疑。

+1

另一種解決方案可能是將代碼包裝在輔助類中。然後,您可以將該類作爲參數傳遞。 – gradosevic

回答

4

不幸的是,您不能使用原始類型resource作爲類型提示。最新的類型提示系統更改爲PHP,scalar type hints,僅添加了int,float,stringbool

您引用的錯誤之前已經出現混淆,特別是在標量類型提示的上下文中。讓我模板爲你:

Argument [N] passed to [Function] must be an instance of [Class], [Type] given

產生了困惑,因爲PHP PHP允許前7類具有相同的名稱爲記錄元(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輸入提示,你必須有一個數組,一個標量或者一個類。