PHP Conference Japan 2024

is_resource

(PHP 4, PHP 5, PHP 7, PHP 8)

is_resource 判斷變數是否為資源類型

描述

is_resource(mixed $value): bool

判斷給定的變數是否為 resource

參數

value

要評估的變數。

回傳值

如果 valueresource,則回傳 true,否則回傳 false

範例

範例 #1 is_resource() 範例

<?php

$handle
= fopen("php://stdout", "w");
if (
is_resource($handle)) {
echo
'$handle 是一個資源';
}

?>

以上範例會輸出

$handle is a resource

注意

注意:

is_resource() 並非嚴格的類型檢查方法:如果 value 是已關閉的資源變數,它將回傳 false

參見

新增註解

使用者貢獻的註解 3 則註解

btleffler [AT] gmail [DOT] com
13 年前
我最近嘗試遍歷一些物件並將它們轉換為陣列,以便將它們編碼為 json 字串。

當我的物件中的一個元素是 SoapClient 時,我遇到了問題。事實證明,json_encode() 不喜歡將任何資源傳遞給它。我簡單的修復方法是使用 is_resource() 來判斷我正在查看的變數是否為資源。

我很快意識到,對於 SoapClient 物件中通常存在的 3 個資源中的 2 個,is_resource() 回傳 false。如果根據 var_dump() 和 get_resource_type() 資源類型為「未知」,則 is_resource() 不認為該變數是資源!

我為此的解決方法是使用 get_resource_type() 而不是 is_resource(),但如果您要檢查的變數不是資源,該函式會拋出錯誤。

因此,如果 is_resource() 不可靠,而如果您沒有將資源傳遞給 get_resource_type(),則會產生錯誤,您應該如何知道變數何時是資源?

我最終做了類似這樣的事情

<?php

function isResource ($possibleResource) { return !is_null(@get_resource_type($possibleResource)); }

?>

@ 運算子會抑制 get_resource_type() 拋出的錯誤,因此如果 $possibleResource 不是資源,它會回傳 null。

我花了太長時間試圖弄清楚這些東西,所以我希望如果有人遇到我遇到的同樣問題,這個評論能幫助他們。
匿名
7 年前
請注意,is_resource() 是不可靠的。它將已關閉的資源視為 false

<?php

$a
= fopen('http://www.google.com', 'r');
var_dump(is_resource($a)); var_dump(is_scalar($a));
//bool(true)
//bool(false)

fclose($a);
var_dump(is_resource($a)); var_dump(is_scalar($a));
//bool(false)
//bool(false)

?>

這就是為什麼這裡有些人感到困惑並設計出一些複雜(糟糕)的「解決方案」來偵測資源的原因...

其實有更好的解決方案...事實上,我剛才已經展示過了,但這裡再次使用一個更完整的範例

<?php

$a
= fopen('http://www.google.com', 'r');
var_dump(is_resource($a)); var_dump(is_scalar($a)); var_dump(is_object($a)); var_dump(is_array($a)); var_dump(is_null($a));
//bool(true)
//bool(false)
//bool(false)
//bool(false)
//bool(false)

?>

那麼,您要如何檢查某個東西是否為資源?

像這樣!

<?php

$a
= fopen('http://www.google.com', 'r');
$isResource = is_resource($a) || ($a !== null && !is_scalar($a) && !is_array($a) && !is_object($a));
var_dump($isResource);
//bool(true)

fclose($a);

var_dump(is_resource($a));
//bool(false)

$isResource = is_resource($a) || ($a !== null && !is_scalar($a) && !is_array($a) && !is_object($a));
var_dump($isResource);
//bool(true)

?>

它是如何運作的

- 一個活動的資源就是一個資源,所以為了效率起見,首先檢查這一點。
- 然後分支檢查變數「不是」什麼
- 資源永遠不會是 NULL。(我們為了效率使用 `!== null` 來進行檢查)。
- 資源永遠不會是純量(整數、浮點數、字串、布林值)。
- 資源永遠不會是陣列。
- 資源永遠不會是物件。
- 如果以上所有檢查都成功,則只剩下一種變數類型:如果它「不是」以上任何一種,那麼它就是一個已關閉的資源!

剛好路過,看到其他人留下的糟糕且不正規的方法,想用這個正確的技巧來幫忙。祝大家好運!

PS: 核心問題在於 is_resource() 對「存活的資源」進行的是「寬鬆」檢查。我希望它有一個 $strict 參數來檢查「任何資源」,而不是需要這些用戶自行想出的變通方法。
CertaiN
10 年前
試試這個來了解行為

<?php
function resource_test($resource, $name) {
echo
'[' . $name. ']',
PHP_EOL,
'(bool)$resource => ',
$resource ? 'TRUE' : 'FALSE',
PHP_EOL,
'get_resource_type($resource) => ',
get_resource_type($resource) ?: 'FALSE',
PHP_EOL,
'is_resource($resource) => ',
is_resource($resource) ? 'TRUE' : 'FALSE',
PHP_EOL,
PHP_EOL
;
}

$resource = tmpfile();
resource_test($resource, '檢查有效的資源');

fclose($resource);
resource_test($resource, '檢查已釋放的資源');

$resource = null;
resource_test($resource, '檢查 NULL');
?>

它會顯示成...

[檢查有效的資源]
(bool)$resource => TRUE
get_resource_type($resource) => stream
is_resource($resource) => TRUE

[檢查已釋放的資源]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resource($resource) => FALSE

[檢查 NULL]
(bool)$resource => FALSE
get_resource_type($resource) => FALSE
警告:get_resource_type() 預期參數 1 為資源,但在 ... 的第 10 行給定 null
is_resource($resource) => FALSE
To Top