Edited at

PHPのリソースに対する認識、間違っていませんか…?

More than 3 years have passed since last update.


解放されたリソースの扱い


検証

次のコードを試してみてください。

<?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_resoruce($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_resoruce($resource) => TRUE

[Check Released Resource]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resoruce($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_resoruce($resource) => FALSE


ポイント


  • リソース型の値は論理型にキャストしたとき必ずTrueになる。

  • リソースは解放されるとリソースタイプが"Unknown"に変化する。is_resource関数はリソース型であるかどうかのチェックの後、リソースタイプが"Unknown"でないかどうかのチェックも行う。


  • is_resource関数は全ての値を受け付けるが、 get_resource_type関数はリソース型の値しか受け付けない