2013-05-01 58 views
11

今天我发现除了对象和原语外,PHP还有resources。该文件指出,默认php passes names by value。但是我们知道,在PHP 5,objects are referenced by handle等等中,虽然句柄是按值传递的,但您可以将句柄作为引用自己处理,整齐地避免了这个问题。是否通过引用传递了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); 
    } 
} 
+0

资源总是通过引用 – 2013-05-01 14:55:48

+3

资源是引用 – 2013-05-01 14:56:59

回答

5

资源不是实际的连接。资源不过是指向连接的指针。所以当你关闭属于这个资源的连接时,不管它是原始的还是复制的都没关系。

1

资源既不是对象,也不是一个变量。它只是一个资源。基本上这意味着你不会真正与资源进行互动,就像一个对象一样。 PHP文档本身说:

“由于资源变量对打开的文件,数据库连接,图像画布区域等有特殊的处理程序,所以转换为资源是没有意义的。”

基本上除非说你正在研究核心Zend引擎或为PECL创建PHP的扩展,否则你会非常担心资源。从PHP编码邮票一点上,我们做的东西对资源的唯一一次是说检查一个数据库连接尝试返回NULL or a resource

您有一个名为get_resource_type()函数返回资源的type喜欢说“文件”的回归一个fopen()函数,但它只是一个有名称的标识符,没什么可解决的。

+0

@raidenance:“我们唯一一次做资源的东西”,这部分没有多大意义。文件操作,外部连接等都使用资源。 – nvanesch 2013-05-01 15:01:38

+1

@nvanesch:我的意思是当我们直接对资源进行操作时,比如说if($ myResource ==“”)......' – raidenace 2013-05-01 15:11:58

+0

好吧,现在我明白了。我以为你的意思是'fopen($ fileResource,“Foo”);'几乎没有使用 – nvanesch 2013-05-02 07:33:46

7

不,他们是不是默认情况下通过引用传递,它们在这种情况下作为任何其他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中的文件毕竟范围的所有引用已被关闭。这意味着,从这种副作用的角度来看,它们可能并不完全等同于其他变量。

+0

准确地说,没有任何东西在PHP中被默认引用。 – SOFe 2017-01-31 07:50:45

+0

@PEMapModder不是真的,对象通过byref。 – 2017-04-19 21:51:00

+1

@NinoŠkopac你根本无法真正传递PHP中的对象。您只能传递对象引用。对象引用默认情况下不会被引用传递。比较函数f(&$ o){$ o = new stdclass; }'和'函数f($ o){$ o = new stdclass; }' – SOFe 2017-04-20 03:54:41

相关问题