12

今日、オブジェクトとプリミティブに加えて、PHP にはリソースがあることを発見しました。ドキュメントには、デフォルトでphp は名前を値で渡すと記載されています。しかし、PHP 5 では、オブジェクトは handle によって参照されることがわかっています。そのため、ハンドルは値で渡されますが、ハンドルを参照自体として扱うことができ、問題をうまく回避できます。

しかし、リソースはどうですか? それらは、オブジェクトのように、それ自体が参照として扱われる単なるハンドルですか、それとも、渡されたときに実際にコピーされる値ですか?

例えば:

/**
 * Close the ftp connection and throw an exception.
 *
 * @hack Because php doesn't have a `finally` statement,
 *       we workaround it to make sure the ftp connection is closed.
 * @param resource $conn FTP Buffer
 * @param Exception $e
 */
function ftpCloseWithException($conn, $e) {
    ftp_close($conn); // <-- Is this the same FTP Buffer resource or a new one?
    throw $e;
}
/**
 * Copy the README file from ftp.mozilla.org or do something equally arbitrary using ftp.
 */
function getMozReadme() {
    try {
        $conn = ftp_connect('ftp.mozilla.org');
        …
    } catch (Exception $e) {
        ftpCloseWithException($conn, $e);
    }
}
4

3 に答える 3

6

リソースは実際の接続ではありません。リソースは、接続へのポインターにすぎません。したがって、このリソースに属する接続を閉じると、それがオリジナルであるかコピーされたものであるかにかかわらず、動作に違いはありません。

于 2013-05-01T14:59:53.867 に答える
1

リソースはオブジェクトでも変数でもありません。それはただのリソースです。基本的にこれが意味することは、オブジェクトなどのリソースと実際にやり取りする方法ではないということです。PHPのドキュメント自体には次のように書かれています:

「リソース変数は、開かれたファイル、データベース接続、画像キャンバス領域などに対する特別なハンドラーを保持するため、リソースへの変換は意味がありません。」

基本的に、Zend Engine のコアに取り組んでいるか、PECL のような PHP の拡張機能を作成している場合を除いて、リソースについて非常に心配するでしょう。PHP コーディング スタンプ ポイントから、リソースに対して何かを行う唯一の時間は、データベース接続の試行が返されたかどうかを確認することです。NULL or a resource

関数を返すために「ファイル」と言うようなリソースget_resource_type()を返す関数が呼び出されましたが、それは単なる名前付き識別子であり、うまくいくものは何もありません..typefopen()

于 2013-05-01T14:58:21.113 に答える