总结了用PHP读取文件的方法。
试着用6种方法读入文件。
file函数
readfile函数
file_get_contents函数
SplFileObject类
fread函数
fgets函数
用file函数读取文件
尝试使用file函数读取文件内容。
用file函数读取的话,读取的文件会作为数组返回。
<?php $contents = file("hello.txt"); foreach ($contents as $number => $content) { $fileNumber = $number + 1; echo "{$fileNumber}: " . $content; }
使用file函数读取了文件。
传递给file函数的是文件的路径。
将文件的路径传递给对方,对方会读取文件并将其排列后返回。(换行的时候就这样。)
返回的文件的内容的排列用foreach语句旋转显示。
$number变量是数组的关键。因为有从0开始的值,所以作为行号使用。
$content变量会一行一行地输入读取的文件内容。
因为$number变量是从0开始的,所以加上1,作为从1开始的行号。
这次我们读取的是本地的文件,也可以指定URL使用Web上的文件。
操作检查
如下准备文件并检查操作。
测试PHP文件读取 导入文本文件 Hello, World!
然后输出就像这样带有行号。
我能够确认它是逐行读取的。
1: 测试PHP文件读取 2: 导入文本文件 3: Hello, World!
使用 readfile 函数读取
使用 readfile 函数读取文件的内容。
readfile 函数是一个读取文件并立即将其写入标准输出的函数。
<?php readfile("hello.txt");
执行时,文件的内容被写入标准输出。
如果你在控制台运行它,文件的内容将原样输出到控制台。
readfile 函数用于在网络上下载文件。
如果你这样写,你访问PHP文件的时候就可以下载任何文件了。
这次,我尝试下载图像文件“test.png”文件。
<?php $image = 'test.png'; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header("Cache-Control: no-cache, must-revalidate"); header("Expires: 0"); header('Content-Disposition: attachment; filename="'.basename($image).'"'); header('Content-Length: ' . filesize($image)); header('Pragma: public'); readfile($image);
使用 file_get_contents 函数读取
尝试使用 file_get_contents 函数读取文件的内容。
file_get_contents 函数读取文件并将其作为字符串返回。
<?php $contents = file_get_contents("hello.txt"); var_dump($contents);
传递的文件路径的内容作为字符串返回到 $contents 变量。
我使用 var_dump 函数输出 $contents 变量的内容。
这次我指定了一个本地文件路径,但您也可以指定一个 URL。
操作检查
如下准备文件并检查操作。
测试PHP文件读取 导入文本文件 Hello, World!
然后,我可以确认字符串是这样返回的。
string(56) "测试PHP文件读取 导入文本文件 Hello, World!"
使用 SplFileObject 类读取
尝试使用 SplFileObject 类读取文件的内容。如果您指定
SplFileObject 类的文件路径,它将返回一个文件对象。
<?php $file = new SplFileObject("hello.txt"); foreach ($file as $number => $content) { $fileNumber = $number + 1; echo "{$fileNumber}: " . $content; }
当您新建 SplFileObject 时,将文件路径传递给构造函数。
这将返回一个文件对象。
我们正在接收 $file 变量中返回的文件对象。
通过将它传递给 foreach 语句,它可以像数组一样使用。
由于 $number 变量存储了一个从 0 开始的数字,它将被用作行号。
$content 变量逐行包含加载文件的内容。
SplFileObject 类还可以使用 setFlags 方法跳过空行。
还有读取CSV文件的设置,所以我觉得读取CSV文件的时候用这个类会很好。
操作检查
如下准备文件并检查操作。
测试PHP文件读取 导入文本文件 Hello, World!
然后结果类似于文件功能。
我能够确认它是逐行读取的。
1: 测试PHP文件读取 2: 导入文本文件 3: Hello, World!
使用 fread 函数读取
使用 fread 函数读取文件。
通过fopen函数访问文件后即可使用。以字符串的形式获取文件的内容。
<?php $filePath = "hello.txt"; $handle = fopen($filePath, "r"); $contents = fread($handle, filesize($filePath)); var_dump($contents); fclose($handle);
首先,在 $filePath 变量中指定要读取的文件路径。
我正在使用 fopen 函数打开文件。
文件路径作为第一个参数传递,模式设置为第二个参数。
由于为模式设置了“r”,因此将读取它。
由于返回了文件的资源类型,因此它存储在 $handle 变量中。
在接下来的过程中,使用 fread 函数读取文件的内容。
第一个参数指定先前获得的资源类型的 $handle 变量。
第二个参数指定要读取的文件的大小。它是通过将文件路径传递给 filesize 函数获得的。
加载文件的内容在 $contents 变量中接收。
var_dump 函数输出变量的内容。
最后,使用 fclose 关闭文件以结束进程。
您传递的是打开文件的资源。
操作检查
如下准备文件并检查操作。
测试PHP文件读取 导入文本文件 Hello, World!
这将给出与 file_get_contents 函数类似的结果。
确认可以以字符串形式获取文件内容。
string(56) "测试PHP文件读取 导入文本文件 Hello, World!"
使用 fgets 函数读取
使用 fgets 函数读取文件。
这也在使用 fopen 函数访问文件后使用。
通过使用 fgets 函数,可以像文件函数一样读取和处理每一行。
<?php $filePath = "hello.txt"; $handle = fopen($filePath, "r"); $number = 1; while ($line = fgets($handle)) { echo "第{$number}行: " . $line; $number += 1; } fclose($handle);
首先,在 $filePath 变量中指定要读取的文件路径。
我正在使用 fopen 函数打开文件。
文件路径作为第一个参数传递,模式设置为第二个参数。
$handle 将返回文件资源。
在下一行中,我们提供了一个 $number 变量用于行号。
我正在使用 while 语句逐行读取文件的内容。
我们传递给 fgets 函数的是我们得到的资源类型的 $handle 变量。
我们将文件的内容逐行存储在 $line 变量中,直到文件的内容被读取。
在循环处理中,我打印出了文件的行号和内容。
最后,fclose 关闭文件并终止进程。
操作检查
如下准备文件并检查操作。
测试PHP文件读取 导入文本文件 Hello, World!
这样的话,就会得到和file函数相同的结果。
一行一行地处理,连同行号一起输出文件的内容。
第1行: 测试PHP文件读取 第2行: 导入文本文件 第3行: Hello, World!
6种文件读取方式总结
下表总结了本次介绍的文件读取方式。
函数/类 | 内容 |
---|---|
file | 逐行读取文件 |
readfile | 读取文件并立即写入标准输出 |
file_get_contents | 将整个文件作为字符串读取 |
SplFileObject | 使用类,以行为单位读取 |
fread | 使用fopen函数获取的资源,用字符串读取文件 |
fgets | 使用fopen函数获取的资源,以行为单位读取文件 |
如果想方便阅读,用file_get_contents函数和file函数好像也不错。
当以字符串形式批量读取时,我使用了 file_get_contents 函数,而当以行为单位读取时,我使用了file函数。
让我们在下载过程中使用 readfile 函数。