is_resource

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

is_resource 查找变量是否为资源

描述

is_resource(混合 $value): 布尔值

查找给定变量是否为 资源.

参数

value

要评估的变量。

返回值

如果 value 是一个 资源,则返回 true,否则返回 false

示例

示例 #1 is_resource() 示例

<?php

$handle
= fopen("php://stdout", "w");
if (
is_resource($handle)) {
echo
'$handle is a resource';
}

?>

上面的示例将输出

$handle is a resource

注释

注意:

is_resource() 不是一个严格的类型检查方法:如果 value 是一个已关闭的资源变量,它将返回 false

参见

添加笔记

用户贡献笔记 3 个笔记

btleffler [AT] gmail [DOT] com
13 年前
我最近尝试遍历一些对象并将它们转换为数组,以便我可以将它们编码为 JSON 字符串。

当我的一个对象的元素是 SoapClient 时,我遇到了问题。事实证明,json_encode() 不喜欢传递给它的任何资源。我的简单解决方法是使用 is_resource() 来确定我正在查看的变量是否为资源。

我很快意识到 is_resource() 对 SoapClient 对象中通常存在的 3 个资源中的 2 个返回 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。

我花了太多时间试图弄清楚这些东西,所以希望这个评论能帮助遇到和我一样问题的其他人。
匿名
6 年前
注意 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` 进行检查,以提高效率)。
- 资源永远不会是标量(int、float、string、bool)。
- 资源永远不会是数组。
- 资源永远不会是对象。
- 如果所有上述检查都成功,则只有一种变量类型会保留:如果它不是上述任何一种,那么它就是一个已关闭的资源!

我只是路过,看到了其他人留下的糟糕和笨拙的方法,想用这种正确的方法来帮助大家。祝大家好运!

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, 'Check Valid Resource');

fclose($resource);
resource_test($resource, 'Check Released Resource');

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

它将显示为...

[Check Valid Resource]
(bool)$resource => TRUE
get_resource_type($resource) => stream
is_resource($resource) => TRUE

[Check Released Resource]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resource($resource) => FALSE

[Check NULL]
(bool)$resource => FALSE
get_resource_type($resource) => FALSE
Warning: get_resource_type() expects parameter 1 to be resource, null given in ... on line 10
is_resource($resource) => FALSE
To Top