2013-05-01 26 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