2024年PHP开发者大会日本站

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 是一个资源';
}

?>

以上示例将输出

$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()资源类型为“Unknown”,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` 进行检查以提高效率)。
- 资源永不是标量(整数、浮点数、字符串、布尔值)。
- 资源永不是数组。
- 资源永不是对象。
- 如果所有上述检查都成功,则只有一种变量类型保留:如果它不是上述任何一种,则它是已关闭的资源!

我只是偶然看到其他人留下的糟糕且不规范的方法,并想用这种正确的方法提供帮助。祝大家好运!

附注:核心问题是 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
警告:get_resource_type() 期望参数 1 为资源,但传入的是 null … 第 10 行
is_resource($resource) => FALSE
To Top