今日、オブジェクトとプリミティブに加えて、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);
}
}