gpt4 book ai didi

php - php资源是通过引用传递的吗?

转载 作者:行者123 更新时间:2023-12-03 01:15:59 25 4
gpt4 key购买 nike

今天我发现除了对象和基元之外,PHP 还有 resources 。文档指出默认情况下 php passes names by value 。但我们知道在 PHP 5 中,objects are referenced by 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);
}
}

最佳答案

不,默认情况下它们通过引用传递,在这种情况下它们将像任何其他 PHP 变量一样处理。检查这个例子:

function test($fd) {
$fd = NULL;
}

$fd = fopen('/tmp/test', 'w+');
test($fd);
var_dump(is_resource($fd)); // bool(true);

...但根据资源的性质,它们指向单个外部资源。这可以是文件、数据库连接或类似的东西。因此,对资源(或其副本)的任何操作都会对该单个外部资源产生直接影响。

检查这个例子:

function close($fd) {
fclose($fd);
}

$fd = fopen('/tmp/test', 'w+');
close($fd);
var_dump(is_resource($fd)); // bool(false);

在上面的示例中,PHP 引擎在文件关闭后重置所有范围内对 $fd 的所有引用。这意味着从这个副作用来看,它们可能与其他变量不完全相同。

关于php - php资源是通过引用传递的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com