1. 程式人生 > 實用技巧 >03 php基礎下

03 php基礎下

1. PHP函式

1.1 函式介紹

函式的英文叫做 : function , 而function的解釋項中有另外一個含義”功能 ”, 函式就是功能 , 呼叫一個函式就是

在呼叫一個功能。

你可以理解成一個函式就是對一快程式碼的封裝,然後呼叫函式,就會把這塊程式碼執行

1.1.1 基本語法

函式的構成元素 :

  • function關鍵字
  • 函式名
  • 引數
  • 函式體
  • return

語法 :

function 函式名(引數名1=值1, 引數名2=值2, 引數名n=值n)
{
    函式中的功能體
    return 返回值
}

例項 :

<?php
    function func(){
        echo '我是func函式';
    }
    func();   
?>

1.1.2 函式引數

引數就在函式名稱後面的一個括號內指定

位置傳參 :

function f($x){
    echo "$x"."\n";   // 列印1
}

f(1)   // 內部會把1賦值給$x

預設值引數 :

function f($x=2){
    echo "$x"."\n";   // 列印2
}

f()    // 可以不傳值,因為$x在定義的時候就已經賦值2了

指定傳參 :

function f($x,$y=2){ // $y的值會被傳入的值替換
    
    echo "$x"."\n";  // 列印1
    echo "$y"."\n";  // 列印3
}

f($x=1,$y=3)   

1.1.3 返回值

return 後面緊跟的就是返回值,函式的返回值會傳給函式的呼叫者,即函式名()

<?php
function add($x,$y)
{
    $total=$x+$y;
    return $total;
}
 
echo add(1,16);   // 列印17
?>

1.2 函式備註說明

  1. 函式名只能是字母,數字,下劃線的組合 , 並且之間不能包含空格 , 數字不能放在函式名首位

  2. 函式名與變數命名規則一樣 , 但是不同的是 , 函式名不區分大小寫

  3. 函式體的引數若是定義了 , 未傳參 , 程式碼會報錯.

  4. 函式後的引數如果有預設值 , 引數可以不填 ,程式碼也不會報錯

  5. 函式後的引數可以寫多個

  6. 函式後如果有預設值和無預設值的引數 , 通常把無預設值的引數寫在最前面

  7. 函式體的變數與函式體外的變數沒有關係

  8. 函式體中若有return , return後的程式碼不執行.

  9. 函式執行完後,可把函式體內的值,帶到函式體外

  10. 函式的執行沒有順序關係,可以在定義外之前的位置呼叫

1.3 函式匯入

在實際開發中,常常需要把程式中的共用程式碼放到一個檔案中,使用這些程式碼的檔案只需要包含這個檔案即可

這種方法有助於提高程式碼的重用性,給程式碼的編寫與維護帶來很大的便利

在PHP中,有以下四種方法包含一個檔案:

序號 函式資訊 說明 包含失敗
1 include 檔案繼續向下執行 , 通常用於動態包含 返回一條警告
2 require 程式碼就不會繼續向下執行 , 通常包含極為重要的檔案,這個程式碼別想執行 返回一個致命錯誤
3 Include_once 除了原有include的功能外,它還會做once檢測,如果檔案曾經被包含過,不在包含 返回一條警告
4 require_once 除了原功能以外,會做一次once檢測,防止檔案反覆被包含 返回一個致命錯誤
// func.php
<?php
	
function func()
{
    echo "執行了func函式"
}  

>    
// demo.php
<?php
// 在func.php檔案的同級目錄新建一個php檔案,寫入以下程式碼
	
include "func.php";

//可以直接呼叫
func();

>   

1.4 常用內建函式

1.4.1 數字常用函式總結

序號 函式資訊 說明 例項
1 abs() 求絕對值 輸入數字 輸出絕對值數字 $abs=abs(-42); //42
2 ceil() 進一法取整輸入浮點數 輸出進一取整 echo ceil(9.999) //10
3 floor() 捨去法取整輸入浮點數 輸出直接捨去小數部分 echo ceil(9.999) //9
4 fmod() 浮點數取餘輸入兩個浮點數 輸出浮點數餘數 $x=5.7;$y=1.3;$r=fmod($x,$y)//$r 0.5
5 pow() 返回數的n此房輸入基礎的n此房 輸出乘方值 echo pow(-1,20)//1
6 round 浮點數四捨五入輸入一個數值 輸出保留小數點後多少位預設為0舍入後的結果 echo round(195583.2)//196
7 sqit 求平方根輸入被開方的數 輸出平方根 echo sqit(9)//3
8 max() 求最大值輸入多個數字或陣列 輸出返回其中的最大值 echo max(1.3.5.6.7) //7echo max(array(2,4,5)) //5
9 min() 求最大值輸入多個數字或陣列 輸出返回其中的最大值 echo min(1.3.5.6.7) //7echo min(array(2,4,5)) //5
10 mt_rand() 更好的隨機數輸入最小和最大 輸出返回其中的最大值 echo min(array(2,4,5)) //5
11 rand() 隨機數輸入最小或最大 輸出返回其中的最大值隨機分配 echo rand()
12 pi() 獲取圓周率值輸入無 輸出獲取圓周率 echo pi(); // 3.1415926535898

1.4.2 字串常用函式總結

序號 函式資訊 說明 例項
1 trim() 刪除字串兩端的空格或其他預定義字元 "$str = "\r\nHello World!\r\n"; echo trim($str);
2 rtrim() 刪除字串右邊的空格或其他預定義字元 "$str = "Hello World!\n\n"; echo rtrim($str);"
3 chop() rtrim()的別名 同上
4 ltrim() 刪除字串左邊的空格或其他預定義字元 "$str = "\r\nHello World!"; echo ltrim($str);"
5 dirname() 迴路徑中的目錄部分(把它歸在了字串函式裡了) echo dirname("c:/testweb/home.php");
6 str_pad() 把字串填充為指定的長度 $str = "Hello World"; echo str_pad($str,20,".");
7 str_repeat() 重複使用指定字串 echo str_repeat(".",13);
8 str_split() 把字串分割到陣列中 print_r(str_split("Hello"));
9 strrev() 反轉字串 echo strrev("Hello World!");
10 wordwrap() 按照指定長度對字串進行折行處理 "$str = ""An example on a long word is: Supercalifragulistic""; echo wordwrap($str,15);"
11 str_shuffle() 隨機地打亂字串中所有字元 echo str_shuffle("Hello World");
12 parse_str() 將字串解析成變數 "parse_str("id=23&name=John%20Adams",$myArray); print_r($myArray);"
13 number_format() 通過千位分組來格式化數字 "echo number_format("1000000"); echo number_format("1000000",2); echo number_format("1000000",2,"","",""."");"
14 strtolower() 字串轉為小寫 echo strtolower("Hello WORLD!");
15 strtoupper() 字串轉為大寫 echo strtoupper("Hello WORLD!");
16 ucfirst() 字串首字母大寫 echo ucfirst("hello world");
17 ucwords() 字串每個單詞首字元轉為大寫 echo ucwords("hello world");
18 htmlentities() 把字元轉為HTML實體 $str = ""John & 'Adams'""; echo htmlentities($str, ENT_COMPAT);
19 htmlspecialchars() 預定義字元轉html編碼
20 nl2br() \n轉義為
21 strip_tags() 剝去 HTML、XML 以及 PHP 的標籤 echo strip_tags("Hello world!");
22 addcslashes() 在指定的字元前新增反斜線轉義字串中字元 $str = ""Hello, my name is John Adams." echo $str; echo addcslashes($str,'m');"
23 stripcslashes() 刪除由addcslashes()新增的反斜線 echo stripcslashes("Hello, \my na\me is Kai Ji\m.");
24 addslashes() 指定預定義字元前新增反斜線 $str = "Who's John Adams?";echo addslashes($str);
25 stripslashes() 刪除由addslashes()新增的轉義字元 echo stripslashes("Who's John Adams?");
26 quotemeta() 在字串中某些預定義的字元前新增反斜線 $str = "Hello world. (can you hear me?)"; echo quotemeta($str);
27 chr() 從指定的 ASCII 值返回字元 echo chr(052);
28 ord() 返回字串第一個字元的 ASCII值 echo ord("hello");
29 strcasecmp() 不區分大小寫比較兩字串 echo strcasecmp("Hello world!","HELLO WORLD!");
30 strcmp() 區分大小寫比較兩字串
31 strncmp() 比較字串前n個字元,區分大小寫
32 strncasecmp() 比較字串前n個字元,不區分大小寫 int strncasecmp ( string $str1 , string $str2 , int $len )
33 strnatcmp() 自然順序法比較字串長度,區分大小寫 int strnatcmp ( string $str1 , string $str2 )
34 strnatcasecmp() 自然順序法比較字串長度,不區分大小寫 int strnatcasecmp ( string $str1 , string $str2 )
35 chunk_split() 將字串分成小塊 str chunk_split(str $body[,int $len[,str $end]])
36 strtok() 切開字串 str strtok(str $str,str $token)
37 explode() 使用一個字串為標誌分割另一個字串 array explode(str $sep,str $str[,int $limit])
38 implode() 同join,將陣列值用預訂字元連線成字串 string implode ( string $glue , array $pieces )
39 substr() 擷取字串 string substr ( string $string , int $start [, int $length ] )
40 str_replace() 字串替換操作,區分大小寫 mix str_replace(mix $search,,mix $replace,mix $subject[,int &$num])
41 str_ireplace() 字串替換操作,不區分大小寫 mix str_ireplace ( mix $search , mix $replace , mix $subject [, int &$count ] )
42 substr_count() 統計一個字串,在另一個字串中出現次數 int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] )
43 substr_replace() 替換字串中某串為另一個字串 mixed substr_replace ( mixed $string , string $replacement , int $start [, int $length ] )
44 str_ireplace() 字串替換操作,不區分大小寫 mix str_ireplace ( mix $search , mix $replace , mix $subject [, int &$count ] )
45 substr_count() 統計一個字串,在另一個字串中出現次數 int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] )
46 substr_replace() 替換字串中某串為另一個字串 mixed substr_replace ( mixed $string , string $replacement , int $start [, int $length ] )
47 similar_text() 返回兩字串相同字元的數量 int similar_text(str $str1,str $str2)
48 strchr() 返回一個字串在另一個字串中開始位置到結束的字串 string strstr ( string $str, string $needle , bool $before_needle )
49 strrchr() 返回一個字串在另一個字串中最後一次出現位置開始到末尾的字串 string strrchr ( string $haystack , mixed $needle )
50 stristr() 返回一個字串在另一個字串中開始位置到結束的字串,不區分大小寫 string stristr ( string $haystack , mixed $needle [, bool $before_needle = false ] )
51 strtr() 轉換字串中的某些字元 string strtr ( string $str , string $from , string $to )
52 strpos() 尋找字串中某字元最先出現的位置 int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
53 stripos() 尋找字串中某字元最先出現的位置,不區分大小寫 int stripos ( string $haystack , string $needle [, int $offset ] )
54 strrpos() 尋找某字串中某字元最後出現的位置 int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )
55 strripos() 尋找某字串中某字元最後出現的位置,不區分大小寫 int strripos ( string $haystack , string $needle [, int $offset ] )
56 strspn() 返回字串中首次符合mask的子字串長度 int strspn ( string $str1 , string $str2 [, int $start [, int $length ]] )
57 strcspn() 返回字串中不符合mask的字串的長度 int strcspn ( string $str1 , string $str2 [, int $start [, int $length ]] )
58 str_word_count() 統計字串含有的單詞數 mix str_word_count(str $str,[])
59 strlen() 統計字串長度 int strlen(str $str)
60 count_chars() 統計字串中所有字母出現次數(0..255) mixed count_chars ( string $string [, int $mode ] )
61 md5()iconv 字串md5編碼 $str = "Hello"; echo md5($str)
62 mb_substr 獲取字串的部分 string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )
63 mb_http_output 設定/獲取 HTTP 輸出字元編碼 mixed mb_http_output ([ string $encoding = mb_http_output() ] )
64 mb_strlen 獲取字串的長度 mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
65 iconv 字串按要求的字元編碼來轉換 string iconv ( string $in_charset , string $out_charset , string $str )
66 iconv_substr 擷取字串的部分
67 iconv_get_encoding 獲取 iconv 擴充套件的內部配置變數
68 mb_substr_count 統計字串出現的次數
69 mb_check_encoding 檢查字串在指定的編碼裡是否有效
70 mb_strrpos 查詢字串在一個字串中最後出現的位置
71 mb_split 使用正則表示式分割多位元組字串
72 parse_url 解釋URL成為一個數組
註釋:mb_* 和iconv_* 他們可以處理多位元組字元,例如:中文。中文主要用的是GBK和utf-8兩種編碼格式。GBK和utf-8是兩個不同的編碼委員會對於漢字進行的編碼的標準。他們規定GBK是雙位元組,也就是一個漢字佔用2Bytes。utf-8是三位元組,一個漢字佔用三個位元組長度的儲存空間。

1.4.3 時間函式總結

getdate()函式是一個內建函式 , 會返回一個數組 , 他們的索引就是 year mon mday等

<?php 
	$mytime = getdate();
	echo "年 :".$mytime['year']."\n";
	echo "月 :".$mytime['mon']."\n";
	echo "日 :".$mytime['mday']."\n";
	echo "時 :".$mytime['hours']."\n";
	echo "分 :".$mytime['minutes']."\n";
	echo "秒 :".$mytime['seconds']."\n";
	echo "時間戳   :".$mytime[0]."\n";
	echo "一個小時中的第幾鍾 :".$mytime['minutes']."\n";
	echo "這是一分鐘的第幾秒 :".$mytime['seconds']."\n";
	echo "星期名稱 :".$mytime['weekday']."\n";
	echo "月份名稱 :".$mytime['month']."\n";
?>

2. 陣列資料結構

2.1 什麼是陣列

陣列的英文是array , 可以存入多個不同型別的資料,是一個複合資料型別。

2.2 定義陣列

$a1 = array(1 , 1.5 , true ,'天王蓋地虎,小雞燉蘑菇')

在上例中,我們發現我們存入了:整型、浮點、布林、字串,可以通過var_dump()函式打印出來顯示

<?php
    
	$a1 = array(1 , 1.5 , true ,'天王蓋地虎,小雞燉蘑菇');
	var_dump($shu);

?>

//array(4) {
//    [0]=>
//  int(1)
//  [1]=>
//  float(1.5)
//  [2]=>
//  bool(true)
//  [3]=>
//  string(33) "天王蓋地虎,小雞燉蘑菇"
//}

2.3 指定索引

陣列的預設索引是從0開始,依次加1直到最後一個元素,當然你也可以自定義索引,如果你從開頭自定義

則後面的元素的索引就從自定義的那個數字依次加1

<?php
    
	$a1 = array(2=>1 , 1.5 , true ,'天王蓋地虎,小雞燉蘑菇');
	var_dump($shu);

?>
//array(4) {
//    [2]=>
//  int(1)
//  [3]=>
//  float(1.5)
//  [4]=>
//  bool(true)
//  [5]=>
//  string(33) "天王蓋地虎,小雞燉蘑菇"
//}

當然你也可以把索引設定成字母

<?php
    
	$a1 = array("name"=>"ymn" ,"age"=>21);
	var_dump($a1);

?>
    
//array(2) {
//  ["name"]=>
//  string(3) "ymn"
//  ["age"]=>
//  int(21)
//}    

2.4 常用運算元組函式

序號 函式資訊 說明
1 array_shift() 彈出陣列中的第一個元素
2 array_unshift() 在陣列的開始處壓入元素
3 array_push() 向陣列的末尾處壓入元素
4 array_pop() 彈出陣列末尾的最後一個元素
5 current() 讀出指標當前位置的值
6 key() 讀出指標當前位置的鍵
7 next() 指標向下移
8 prev() 向上移
9 reset() 指標到開始處
10 end() 指標到結束處

這些函式,也是面試中基礎面試中最愛問到的問題。

序號 函式資訊 說明
1 array_combine() 生成一個數組,用一個數組的值作為鍵名,另一個數組值作為值
2 range() 建立並返回一個包含指定範圍的元素的陣列。
3 compact() 建立一個由引數所帶變數組成的陣列
4 array_fill() 用給定的值生成陣列
5 array_chunk() 把一個數組分割為新的陣列塊
6 array_merge() 把兩個或多個數組合併為一個數組
7 array_slice() 在陣列中根據條件取出一段值,並返回
8 array_diff() 返回兩個陣列的差集陣列
9 array_search() 在陣列中搜索給定的值,如果成功則返回相應的鍵名
10 array_splice() 把陣列中的一部分去掉並用其它值取代
11 array_sum() 計算陣列中所有值的和
12 in_array() 檢查陣列中是否存在某個值
13 array_key_exists() 檢查給定的鍵名或索引是否存在於陣列中
14 shuffle() 將陣列打亂,保留鍵值
15 count() 計算陣列中的單元數目或物件中的屬性個數
16 array_flip() 返回一個鍵值反轉後的陣列
17 array_keys() 返回陣列所有的鍵,組成一個數組
18 array_values() 返回陣列中所有值,組成一個數組
19 array_reverse() 返回一個元素順序相反的陣列
20 array_count_values() 統計陣列中所有的值出現的次數
21 array_rand() 從陣列中隨機抽取一個或多個元素,注意是鍵名
22 array_unique() 刪除重複值,返回剩餘陣列
23 sort() 按升序對給定陣列的值排序,不保留鍵名
24 rsort() 對陣列逆向排序,不保留鍵名
25 asort() 對陣列排序,保持索引關係
26 arsort() 對陣列逆向排序,保持索引關係
27 ksort() 按鍵名對陣列排序
28 krsort() 將陣列按照鍵逆向排序
29 natsort() 用自然順序演算法對陣列中的元素排序
30 natcasesort() 自然排序,不區分大小寫
31 array_filter() 去掉陣列中的空元素或者預定元素
32 extract() 將鍵變為變數名,將值變為變數值

3. PHP中的正則表示式

正則表示式就是匹配字元的規則

正則表達是會在開發中經常看到,它主要用在以下一些地方:匹配郵箱、手機號碼、驗證碼、替換敏感的關鍵詞。

例如:涉及政治和罵人的話

PHP的正則表達示定界符的規定如下:定界符,不能用a-zA-Z0-9\ 其他的都可以用。必須成對出現,有開始就

有結束。

3.1 定義方法

例子					   說明
/中間寫正則/				 正確   (常用這個)
$中間寫正則$				 正確
%中間寫正則%			     正確
^中間寫正則^			     正確
@中間寫正則@			     正確
(中間寫正則)				 錯誤  /\//
A中間寫正則A			     錯誤

3.2 轉義字元

在php中\(反斜槓)是具有轉義的意思的,如果在\後面緊跟一個n那麼n就會被轉義成換行

如果你想取消轉義只需要在前面再加一個\即可

/\//     // 把/取消轉義,/原本是正則的結束,加上\就是普通的/(斜槓)了

3.3 preg_match函式

<?php
	$zz = '/wq/';
	$string = 'ssssswqaaaaaa';
	if(preg_match($zz, $string, $matches)){  // 匹配的結果會賦值給$matches(陣列)
    	echo '匹配到了,結果為:'.$matches[0]."\n";
    	var_dump($matches);
	}else{
    	echo '沒有匹配到';
	}
?>

3.4 常用的正則函式

序號 函式資訊 說明
1 preg_filter() 執行一個正則表示式搜尋和替換
2 preg_grep() 返回匹配模式的陣列條目
3 preg_match() 執行一個正則表示式匹配
4 preg_match_all() 執行一個全域性正則表示式匹配
5 preg_replace_callback_array() 傳入陣列,執行一個正則表示式搜尋和替換使用回撥
6 preg_replace_callback() 執行一個正則表示式搜尋並且使用一個回撥進行替換
7 preg_replace() 執行一個正則表示式的搜尋和替換
8 preg_split() 通過一個正則表示式分隔字串
$zz = '/wq/';
$string = 'asdwqfggwqaaaawqaa';
$res = preg_split($zz, $string); // 匹配的結果會賦值給$res(陣列)

var_dump($res);

//array(4) {
//  [0]=>
//  string(3) "asd"
//  [1]=>
//  string(3) "fgg"
//  [2]=>
//  string(4) "aaaa"
//  [3]=>
//  string(2) "aa"
//}

4. php檔案管理

4.1 檔案介紹

我們會點滑鼠右鍵刪除檔案、會control+c(或右鍵)複製、貼上檔案,會新建一些檔案,檢測這個檔案是不是隻

讀檔案。在電腦裡面進行的這些操作,在程式碼裡面如果能操作就好了。因為,如果有了這些操作。我們能做很多事

情了:可不可以寫入修改配置檔案、是不是可以做PHP安裝的時候檢測檔案的許可權、是不是可以做生成Html檔案

等等很多不同的操作,總之其他太多太多的地方用到了檔案操作。

4.2 簡單的讀取檔案

4.2.1 readfile函式

readfile( "檔案路徑" )會直接將檔案內容列印在控制檯

<?php
	readfile('test.txt')
?>

4.2.2 file_get_content函式

<?php
   $filename = 'test.txt';
   $filestring = file_get_contents($filename); //開啟檔案把內容讀出來,賦值$filestring
   echo $filest
ring;
?>

4.3 檔案操作三步驟

4.3.1 fopen開啟檔案

當你用fopen開啟一個檔案之前,應該先指定好模式

常見模式 :

  • r模式 只讀
  • w模式 只寫
  • a模式 追加模式

fopen的8種模式

模式 描述
r 只讀。在檔案的開頭開始。
r+ 讀/寫。在檔案的開頭開始。
w 只寫。開啟並清空檔案的內容;如果檔案不存在,則建立新檔案。
w+ 讀/寫。開啟並清空檔案的內容;如果檔案不存在,則建立新檔案。
a 追加。開啟並向檔案末尾進行寫操作,如果檔案不存在,則建立新檔案。
a+ 讀/追加。通過向檔案末尾寫內容,來保持檔案內容。
x 只寫。建立新檔案。如果檔案已存在,則返回 FALSE 和一個錯誤。
x+ 讀/寫。建立新檔案。如果檔案已存在,則返回 FALSE 和一個錯誤。

如果 fopen() 函式無法開啟指定檔案,則返回 0 (false)。

<?php
	$fp = fopen('test.txt','r');
	echo var_dump($fp);
	// resource(5) of type (stream)

	$fp = fopen('test1.txt','r');
	echo var_dump($fp);
	// bool(false)
?>

4.3.2 讀操作

逐行讀取檔案

gets() 函式用於從檔案中逐行讀取檔案。

註釋:在呼叫該函式之後,檔案指標會移動到下一行。

<?php
	$file = fopen("welcome.txt", "r") or exit("無法開啟檔案!");
	// 讀取檔案每一行,直到檔案結尾
	while(!feof($file))
        // feof($file)判斷檔案指標是否在檔案末尾
	{
    	echo fgets($file);   // 讀取檔案內容,自動換行
	}
	fclose($file);
?>

逐字元讀取檔案

fgetc() 函式用於從檔案中逐字元地讀取檔案。

註釋:在呼叫該函式之後,檔案指標會移動到下一個字元。

<?php
	$file=fopen("text.txt","r");
	while (!feof($file))
	{
  		echo fgetc($file);
	}
	fclose($file);
?>

4.3.3 寫操作

注意 : 想要向檔案中寫入內容,必須先指定模式為w

<?php
   $filename = 'test.txt';
   $fp= fopen($filename, "w");
   $len = fwrite($fp, '我是一隻來自南方的狼,卻在北方凍成了狗');
   fclose($fp);
   print $len .'位元組被寫入了\n';
?>
    
// 程式碼說明:
// 不論有沒有新建都會開啟檔案重新寫入
// 原有的檔案內容會被覆蓋掉
// 檔案不存在會建立

4.3.4 關閉檔案

因為計算機不會像人類那麼聰明,你不告訴他關閉檔案,它是不會自己關閉檔案的,所以當你開啟檔案,然後操作

完成後 ,一定要注意要關閉檔案。

<?php

$fp = fopen('test.txt','w');    
fwrite($fp,'晚上吃什麼?');
fclose($fp);
    
?>    

4.4 php 建立臨時檔案

我們之前建立的檔案都是永久檔案,而建立臨時檔案在我們平時的專案開發中也非常有用,建立臨時檔案的好處:

檔案操作完成後即刪除,不需要去維護這個檔案的刪除狀態。

<?php
   //建立了一個臨時檔案
   $handle = tmpfile();
   //向裡面寫入了資料
   $numbytes = fwrite($handle, '寫入臨時檔案');
   //關閉臨時檔案,檔案即被刪除
   fclose($handle);
   echo  '向臨時檔案中寫入了'.$numbytes . '個位元組';
?>

4.5 其他檔案操作

4.5.1 重新命名檔案

rename($舊名,$新名)

功能:這個函式返回一個bool值,將舊的名字改為新的名字。

<?php
   //舊檔名
   $filename = 'test.txt';
   //新檔名
   $filename2 = 'new_test.txt';
   //重名名檔案
   rename($filename, $filename2);
?>

4.5.2 複製檔案

複製檔案,就相當於是克隆技術,將一個原來的東西再克隆成一個新的東西,兩個長得一模一樣。

copy(原始檔,目標檔案)

功能:將指定路徑的原始檔,複製一份到目標檔案的位置。

<?php
   //舊檔案
   $filename = 'demo.txt';
   //新檔案
   $filename2 = 'demo_copy.txt';
   //複製檔案
   copy($filename, $filename2);
?>
說明:會通過上面的例子,發現多出來了一個檔案。

4.5.3 刪除檔案

刪除檔案就是將指定路徑的一個檔案刪除,不過這個刪除是直接刪除。使用的是windows電腦,你在回收站看不

到這個檔案,你只會發現這個檔案被刪除了。

unlink(指定路徑的檔案) 返回一個bool值

<?php
   $filename = 'test.txt';
   if (unlink($filename)) {
       echo  "刪除檔案成功 $filename!\n";
   } else {
       echo  "刪除 $filename 失敗!\n";
   }
?>

4.5.4 檢測檔案屬性函式

常用檔案屬性函式:

序號 函式資訊 說明
1 file_exists( $指定檔名或者檔案路徑) 檔案是否存在。
2 is_readable ( $指定檔名或者檔案路徑) 檔案是否可讀
3 is_writeable ( $指定檔名或者檔案路徑) 檔案是否可寫
4 is_executable ( $指定檔名或者檔案路徑) 檔案是否可執行
5 is_file ( $指定檔名或者檔案路徑) 是否是檔案
6 is_dir ( $指定檔名或者檔案路徑) 是否是目錄
7 void clearstatcache ( void ) 清楚檔案的狀態快取
<?php
	$filename = 'test.txt';
	echo var_dump(file_exists($filename))   // 返回bool值
?>

4.6 目錄處理函式

php 目錄處理函式處理資料夾的基本思想如下:

  • 讀取某個路徑的時候判斷是否是資料夾

  • 是資料夾的話,開啟指定資料夾,返回檔案目錄的資源變數

  • 使用readdir讀取一次目錄中的檔案,目錄指標向後偏移一次

  • 使用readdir讀取到最後,沒有可讀的檔案返回false

  • 關閉檔案目錄

我們來學習一下常用函式

序號 函式資訊 說明
1 opendir 開啟資料夾,返回操作資源
2 readdir 讀取資料夾資源
3 is_dir 判斷是否是資料夾
4 closedir 關閉資料夾操作資源
5 filetype 顯示是資料夾還是檔案,檔案顯示file,資料夾顯示dir
<?php
//設定開啟的目錄是D盤
$dir = "d:/";
//判斷是否是資料夾,是資料夾
if (is_dir($dir)) {
   if ($dh = opendir($dir)) {
      //讀取到最後返回false,停止迴圈
      while (($file = readdir($dh)) !== false) {
           echo "檔名為: $file : 檔案的型別是: " . filetype($dir . $file) . "<br />";
       }
       closedir($dh);
   }
}
?>
序號 函式 說明
1 pathinfo 返回檔案的各個組成部分
2 basename 返回檔名
3 dirname 檔案目錄部份
<?php
	$path_parts = pathinfo('d:/www/index.php');
	echo '檔案目錄名:'.$path_parts['dirname']."<br />";
	echo '檔案全名:'.$path_parts['basename']."<br />";
	echo '副檔名:'.$path_parts['extension']."<br />";
	echo '不包含擴充套件的檔名:'.$path_parts['filename']."<br />"; 
?>

4.7 php實現檔案留言本

index.php

<?php
//設定時區
date_default_timezone_set('PRC');
//讀了內容
@$string = file_get_contents('message.txt');
//如果$string 不為空的時候執行,也就是message.txt中有留言資料
if (!empty($string)) {
    //每一段留言有一個分格符,但是最後多出了一個&^。因此,我們要將&^刪掉
    $string = rtrim($string, '&^');
    //以&^切成陣列
    $arr = explode('&^', $string);
    //將留言內容讀取
    foreach ($arr as $value) {
        //將使用者名稱和內容分開
        list($username, $content, $time) = explode('$#', $value);
        echo '使用者名稱為<font color="gree">' . $username . '</font>內容為<font color="red">' . $content . '</font>時間為' . date('Y-m-d H:i:s', $time);
        echo '<hr />';
    }
}
?>
<h1>基於檔案的留言本演示</h1>
<form action="write.php" method="post">
    使用者名稱:<input type="text" name="username" /><br />
    留言內容:<textarea  name="content"></textarea><br />
    <input type="submit" value="提交" />
</form>

write.php

<?php
//追加方式開啟檔案
$fp=fopen('message.txt','a');
//設定時間
$time=time();
//得到使用者名稱
$username=trim($_POST['username']);
//得到內容
$content=trim($_POST['content']);
//組合寫入的字串:內容和使用者之間分開,使用$#
//行與行之間分開,使用&^
$string=$username.'$#'.$content.'$#'.$time.'&^';
//寫入檔案
fwrite($fp,$string);
//關閉檔案
fclose($fp);
header('location:index.php');
?>