PHP中feof()函數(shù)實(shí)例測試
本文實(shí)例講述了PHP中的feof()函數(shù)的用法,針對feof()函數(shù)進(jìn)行了一定的測試,很有實(shí)用價(jià)值。具體分析如下:
本文實(shí)例運(yùn)行環(huán)境:
OS:Mac OS X 10.8.4
PHP:5.3.15
在PHP的官方手冊中,函數(shù)feof()下面的討論不少,對此做了一些相關(guān)的測試如下。
測試代碼如下:
<?php
print <<<EOF
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>測試PHP中的feof()函數(shù)效果</title>
</head>
<body>
<div>
EOF;
function bool2str($bool) {
if ($bool == TRUE) {
return "TRUE";
} else {
return "FALSE";
}
}
/*
* 請隨便創(chuàng)建一個(gè)文件。
* 比如:本測試中,在腳本文件的相同路徑下創(chuàng)建了一個(gè)文本文件,
* 文件內(nèi)容為“abcdefg”,文件名為“7bytesfile”。
*/
$filename = './7bytesfile';
$handle = fopen($filename, 'r');
if (!$handle) {
die("文件打開失敗");
}
for($i = 0; $i <= filesize($filename); $i++) {
fseek($handle, $i);
echo "文件位置" . ftell($handle) . ":<br />\n";
echo "執(zhí)行fseek,尚未執(zhí)行讀取操作之前,feof結(jié)果:" . bool2str(feof($handle)) . "<br />\n";
echo "當(dāng)前位置字符:" . fgetc($handle) . "<br />\n";
echo "執(zhí)行文件讀取操作之后,feof結(jié)果:" . bool2str(feof($handle)) . "<hr />\n";
}
/*
* 通過上面一段代碼可以觀察到,
* 隨著循環(huán)的執(zhí)行,文件指針從文件頭一直移動到文件末尾。
* 但是當(dāng)完成了字符“g”的讀取輸出,文件指針繼續(xù)向后移動,這是feof()依然返回False。
* 只有當(dāng)執(zhí)行了一次fgetc()操作之后,才返回true,表示到達(dá)文件末尾。
*/
echo "ftell()結(jié)果:". ftell($handle). "<hr />\n";
//輸出一下,很郁悶的發(fā)現(xiàn)文件指針的位置還是7。+_+
fseek($handle, 4);
echo "文件位置" . ftell($handle) . ":<br />\n";
echo "執(zhí)行fseek,尚未執(zhí)行讀取操作之前,feof結(jié)果:" . bool2str(feof($handle)) . "<br />\n";
echo "當(dāng)前位置字符:" . fgetc($handle) . "<br />\n";
echo "執(zhí)行文件讀取操作之后,feof結(jié)果:" . bool2str(feof($handle)) . "<hr />\n";
fseek($handle, 7);
echo "文件位置" . ftell($handle) . ":<br />\n";
echo "執(zhí)行fseek,尚未執(zhí)行讀取操作之前,feof結(jié)果:" . bool2str(feof($handle)) . "<br />\n";
echo "當(dāng)前位置字符:" . fgetc($handle) . "<br />\n";
echo "執(zhí)行文件讀取操作之后,feof結(jié)果:" . bool2str(feof($handle)) . "<hr />\n";
fclose($handle);
//再次移動文件指針,效果依舊。
//再用另外一段代碼測試一下:
$handle = fopen($filename, 'r');
if (!$handle) {
die("文件打開失敗");
}
while (!feof($handle)) {
$char = fgetc($handle);
if ($char === FALSE) {
echo 'FALSE';
} else {
echo $char;
}
}
fclose($handle);
//依然是輸出了字符g之后,再次執(zhí)行讀取操作,才終止循環(huán)。
print <<<EOF
</div>
</body>
</html>
EOF;
?>
針對這種情況的猜測是,在PHP中,feof()的實(shí)現(xiàn)方式并非直接檢查文件指針相對于文件的位置,而是根據(jù)某個(gè)標(biāo)識返回結(jié)果。每次fseek()之后都會都會把這個(gè)標(biāo)識設(shè)置為“False”,只有當(dāng)執(zhí)行一次文件內(nèi)容讀取操作之后,才會根據(jù)文件讀取的結(jié)果對標(biāo)識進(jìn)行設(shè)置。
根據(jù)這種猜測,可以使用兩種代碼邏輯。
一個(gè)方法是不做feof()檢測,直接檢測內(nèi)容讀取函數(shù)(比如fgetc()、fgets())的執(zhí)行結(jié)果。
示例代碼如下:
while (($content = fgets($fileHandle)) !==FALSE) {
//文件內(nèi)容處理……
}
這種處理辦法,利用了PHP被詬病的函數(shù)返回方式,所以得用“===”或“!==”進(jìn)行檢測,不能把代碼簡化成:
while ($content = fgets($fileHandle)) {}
另外一個(gè)方法是先進(jìn)行一次文件讀取,然后再進(jìn)入feof()循環(huán),如下所示:
$content = fgets($fileHandle);
while (!feof($fileHandle)) {
//處理文件內(nèi)容……
$content = fgets($fileHandle);
}
經(jīng)過測試,前一種方法效率會高一些。
希望本文示例對大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP文件運(yùn)行步驟以及數(shù)據(jù)庫的連接代碼
PHP經(jīng)常搭配MySQL來使用,那么PHP怎樣連接MySQL數(shù)據(jù)庫呢?這篇文章主要給大家介紹了關(guān)于PHP文件運(yùn)行步驟以及數(shù)據(jù)庫連接的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
PHP命名空間namespace定義及導(dǎo)入use用法詳解
這篇文章主要介紹了PHP命名空間namespace定義及導(dǎo)入use用法,結(jié)合實(shí)例形式詳細(xì)分析了php中命名空間namespace的功能、定義及導(dǎo)入use相關(guān)使用方法與操作技巧,需要的朋友可以參考下2018-03-03
php 獲取可變函數(shù)參數(shù)的函數(shù)
php取得可變函數(shù)參數(shù),方便后面的控制。2009-08-08
php縮放圖片(根據(jù)寬高的等比例縮放)實(shí)例介紹
設(shè)定寬高,不等比例縮放;設(shè)定寬度,等比例縮放;設(shè)定高度,等比例縮放;按比例,縮放至50%;縮放后直接輸出到屏幕等等,具體使用方法如下,感興趣的額朋友可以了解下哈2013-06-06
PHP使用Curl實(shí)現(xiàn)模擬登錄及抓取數(shù)據(jù)功能示例
這篇文章主要介紹了PHP使用Curl實(shí)現(xiàn)模擬登錄及抓取數(shù)據(jù)功能,結(jié)合實(shí)例形式分析了php使用curl進(jìn)行登陸、驗(yàn)證、cookie操作與數(shù)據(jù)抓取等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04
使用PHP實(shí)現(xiàn)密??üδ軐?shí)現(xiàn)代碼<打包下載直接運(yùn)行>
PHP實(shí)現(xiàn)密??üδ軐?shí)現(xiàn)代碼,腳本之家提供下載可以直接運(yùn)行的~!不需要數(shù)據(jù)庫也不需要其他的,下載解壓直接放環(huán)境中就可以看到效果2011-10-10
Php 構(gòu)造函數(shù)construct的前下劃線是雙的_
最近寫php的class時(shí),總是碰到function non object的錯(cuò)誤,知道是類沒有實(shí)例化,但就是不知道錯(cuò)誤在哪里。2009-12-12
PHP strip_tags()去除HTML、XML以及PHP的標(biāo)簽介紹
這篇文章主要介紹了PHP strip_tags()去除HTML、XML以及PHP的標(biāo)簽介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02

