今天我发现除了对象和基元之外,PHP 还有资源 http://php.net/manual/en/language.types.resource.php。文档说明默认情况下php 按值传递名称 http://php.net/manual/en/functions.arguments.php#functions.arguments.by-reference。但我们知道在 PHP 5 中,对象通过句柄引用 http://www.php.net/manual/en/migration5.oop.php,因此当句柄按值传递时,您可以将句柄本身视为引用,从而巧妙地避免了这个问题。
但是关于资源?它们是否像对象一样,只是将句柄本身视为引用,还是它们实际上是在传递时被复制的值?
例如:
/**
* 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);
}
}
不,是他们not默认情况下通过引用传递,在这种情况下它们将像任何其他 PHP 变量一样处理。检查这个例子:
function test($fd) {
$fd = NULL;
}
$fd = fopen('/tmp/test', 'w+');
test($fd);
var_dump(is_resource($fd)); // bool(true);
...但根据资源的性质,他们指出了single外部资源。这可以是文件、数据库连接或类似的东西。因此,对资源(或其副本)的任何操作都会对其产生直接影响single外部资源。
检查这个例子:
function close($fd) {
fclose($fd);
}
$fd = fopen('/tmp/test', 'w+');
close($fd);
var_dump(is_resource($fd)); // bool(false);
在上面的示例中,PHP 引擎重置了all文件关闭后在所有范围内对 $fd 的引用。这意味着从这种副作用来看,它们可能并不完全是same作为其他变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)