2017-06-22 85 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' 

将输出文件的内容,即使三个变量是用来阅读的内容。