2017-06-22 86 views
0

假設我們有一個名爲languages.txt文件,該文件具有以下內容:PHP:傳遞資源數據類型作爲參數傳遞給函數

AJAX HTML CSS JQUERY

這裏的PHP代碼閱讀上述文件:

<?php 

function read ($fh2, $length) { 

    return (fread($fh2,$length)); 

} 

$fh1 = fopen ('languages.txt', 'r') ; 

echo read ($fh1, 7) ; 

echo read ($fh1, 4) ; 

?> 

我們知道,在PHP中,局部變量是局部函數,全局變量在函數之外是可用的。

因此,考慮$ FH1作爲一個全局變量,$ FH2爲局部變量和兩個彼此獨立的我預期的輸出爲

AJAX HTAJAX

但是,在輸出出來是

AJAX HTMLç

任何人都可以解釋我發生了什麼?當resource數據類型作爲參數傳遞給一個函數時,它是否通過引用傳遞,而不像int數據類型?

+0

它與本地/全局變量沒有任何關係 –

+0

資源var是對外部資源的引用,因此無論它是原始資源var還是副本,它仍然是對外部資源的引用,在這種情況下,一個打開的文件。 – AbraCadaver

回答

2

當您使用像fread()這樣的函數時,文件指針會在文件中向前移動。這就是爲什麼你的意見不是你所期望的。

如果要返回到文件的開頭,可以使用rewind()

你可以做的是$line = fgets($fh)並得到一整行,然後根據使用的分隔符,你可以將所述行分割成像$exploded = explode("\t", $line)這樣的數組。

+0

我想這是文件指針,而不是描述符 –

+0

'$ fh'是文件描述符,我的不好。 –

+0

是的,它只是讀出第一個11個字符 – TimBrownlaw

0

fopen()返回的資源不包含該文件的內容。它封裝了操作系統提供的文件句柄。

OS使用文件句柄來標識包含有關打開文件狀態信息的數據結構。這個狀態信息包括一個所謂的文件指針,它是文件中下一個讀或寫操作發生的位置。

您的代碼通過值傳遞fopen()返回的值,但是,因爲它只是一個指向實際數據結構的指針,無論您創建了多少(本地或全局)$fh1副本,它們都指向相同的結構在後臺管理相同的文件。

這意味着下面的代碼:

$fh1 = fopen('languages.txt', 'r'); 
echo(read($fh1, 7));    // 'AJAX HT' 
$fh2 = fh1; 
echo(read($fh2, 4));    // 'ML C' 
echo(read($fh1, 3));    // 'SS ' 
$fh3 = $fh2; 
echo(read($fh3, 6));    // 'JQUERY' 

將輸出文件的內容,即使三個變量是用來閱讀的內容。