假设我们有一个名为languages.txt的文件,其中包含以下内容:
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 C
有谁能解释我发生了什么?将resource
数据类型作为参数传递给函数时,它是否通过引用传递,而不像int
数据类型?
答案 0 :(得分:2)
使用fread()
等函数时,文件指针会在文件中向前移动。这就是为什么你的输入不是你期望的那样。
如果要返回文件的开头,可以使用rewind()
。
你可以做的是$line = fgets($fh)
并得到一整行,然后根据使用的分隔符你可以将所述行拆分成一个类似$exploded = explode("\t", $line)
的数组。
答案 1 :(得分:0)
fopen()
返回的资源不包含文件内容。它封装了OS提供的文件句柄。
操作系统使用文件句柄来标识包含有关打开文件状态信息的数据结构。此状态信息包括一个所谓的文件指针,它是文件中将进行下一个读或写操作的位置。
您的代码按值传递{32000: 1.8890589139490572,
32400: 4.179591667602584,
34400: 3.535288642213845,
34800: 6.790257706444404}
返回的值,但是,因为它只是指向实际数据结构的指针,无论您创建的fopen()
多少(本地或全局)副本,它们都指向在后台管理同一文件的相同结构。
这意味着以下代码:
$fh1
将输出文件的内容,即使使用三个变量来读取内容。