PHP+MySQL互動式網頁程式設計班 PHP進階語法 講師:林業峻 CSIE, NTU 6/ 19, 2010
課程大綱 檔案 函式 物件
fopen(): 開檔 與 fclose(): 關檔 用於開啟檔案,檔案若為讀取模式,在使用前是 需先經過開啟動作的。 使用格式: 檔案變數 = fopen(“檔名”, “模式”); 檔案變數:記錄欲開啟的檔案之相關資料。 模式:檔案使用模式,指的是檔案被開啟之後的使用方式。 fclose(檔案變數); 模式 "r" 開啟一個文字檔(text),供程式讀取。如果磁碟內不包含這個檔案,則此檔案開啟失敗 "w" 開啟一個文字檔(text),供程式將資料寫入此檔案內。如果磁碟內不包含這個檔案,則系統會自行建立這個檔案。如果磁碟內包含這個檔案,則此檔案內容會被蓋過而消失。 "x" 開啟一個文字檔(text),供程式將資料寫入此檔案內。如果磁碟內不包含這個檔案,則系統會自行建立這個檔案。如果磁碟內包含這個檔案,則此檔案開啟失敗。 "a" 開啟一個文字檔(text),供程式將資料寫入此檔案的末端。如果此檔案不存在,則系統會自行建立此檔案。
fprintf(): 寫檔 將資料以格式化方式寫入某檔案內。 使用格式: fprintf(檔案變數,“輸出格式”,變數1,變數1, …變數n); 格式中使用%s對應後面要寫到檔案的變數 <html> <head><title>PHP範例程式</title></head> <body> <? $n = 10; $str = "Hello"; $fp = fopen("file.txt", "w"); fprintf($fp, "%s %s", $n, $str); fclose($fp); ?> </body> </html>
fscanf(): 讀檔 從某個檔案讀取資料。 使用格式: fscanf(檔案變數,“輸入格式”, 變數1,變數1, …變數n); <html> <head><title>PHP範例程式</title></head> <body> <? $fp = fopen("file.txt", "r"); fscanf($fp, "%s %s", $n, $str); fclose($fp); echo "$n $str"; ?> </body> </html>
檔案應用: 網頁計數器 建立一個count.txt文字檔,裡面存一個整數0 寫一個php程式, 每次執行都會將count.txt中的數 字遞增1後, 輸出到網頁中 (counter.php) <html> <head><title>PHP範例程式</title></head> <body> <? $fp = fopen("count.txt", "r"); fscanf($fp, "%s", $n); fclose($fp); $n++; echo "目前人數: $n"; $fp = fopen("count.txt", "w"); fprintf($fp, "%s", $n); ?> </body> </html>
練習 設計一個訪客意見留言表單, 將留言另存成檔 (message.htm) 提示: 利用計數器原理,設計檔案名稱
課程大綱 檔案 函式 物件
函式 包函許多程式碼的一行程式 (用來代表某種功能) 當程式碼太多時,可以將部份程式碼抽離主程式,寫 成一段函式,有需要用到時再去呼叫它 語法: function 函式名稱(參數1,參數2, …,參數n) { 程式碼; return 回傳值; } PHP的自訂函式有幾個特性: 函式本身可以傳入多個或不傳入參數 函式只可以回傳一個值。 函式內的變數是獨立的,不會受外在變數的影響。
函式 範例: 將印出三次Hello!的函式 function hello() <html> <head> <title>PHP範例程式</title> <? function hello() { echo "Hello!<br>"; } ?> </head> <body> hello(); </body> </html>
練習 範例: 設計一個函式貼出a.jpg, 寬度為120, 點圖可顯 示全圖 (hyperImage.php) function hyperImage() <html> <head> <title>PHP範例程式</title> <? function hyperImage() { //請寫此函式內容 } ?> </head> <body> hyperImage(); </body> </html>
函式的參數與回傳值應用 範例: 設計一個計算兩個整數相加的函式 function add($x, $y) <html> <head> <title>PHP範例程式</title> <? function add($x, $y) { $sum = $x + $y; return $sum; } ?> </head> <body> $n = add(10, 20); echo "$n<br>"; $n = add(50, 30); </body> </html>
練習 範例: 設計一個函式貼出一張可設檔名與寬度的圖, 點 圖可顯示全圖 (hyperImage2.php) function hyperImage($name, $w) <html> <head> <title>PHP範例程式</title> <? function hyperImage($name, $w) { //請寫此函式內容 } ?> </head> <body> hyperImage("a.jpg", 120); hyperImage("a.jpg", 240); hyperImage("a.jpg", 480); </body> </html>
函式內的變數是獨立的 下列中函式裡的$n遞增, 不影響body中的$n, 因為函 式內的變數是獨立的 <html> <head> <title>PHP範例程式</title> <? function increment($n) { $n++; echo "函式中的n = $n<br>"; } ?> </head> <body> $n = 0; increment($n); echo "呼叫函式後的n = $n<br>"; </body> </html>
函式內的變數是獨立的 在參數變數前加&, 讓body傳入的$n與函式裡的$n相 同, 則函式裡改變$n值會影響body中的$n <html> <head> <title>PHP範例程式</title> <? function increment(&$n) { $n++; echo "函式中的n = $n<br>"; } ?> </head> <body> $n = 0; increment($n); echo "呼叫函式後的n = $n<br>"; </body> </html>
函式內的變數是獨立的 因為函式內的變數是獨立的, 因此在函式內宣告的變 數, body中無法使用 <html> <head> <title>PHP範例程式</title> <? function func() { $n = 10; } ?> </head> <body> func(); echo "呼叫函式後的n = $n<br>"; </body> </html>
函式內的變數是獨立的 如果要讓函式內宣告的變數可在body中使用, 要將變 數宣告為全域變數 語法: global $變數名稱; <html> <head> <title>PHP範例程式</title> <? function func() { global $n; $n = 10; } ?> </head> <body> func(); echo "呼叫函式後的n = $n<br>"; </body> </html>
函式參數為陣列之應用 從當傳入一個陣列到函式時, 通常需要將資料各數一 併傳入, 以便做重複控制 範例: 製作一個函式, 計算 陣列中n個數字的平均 function average($n, $data) <html> <head> <title>PHP範例程式</title> <? function average($n, $data) { $sum = 0; for($i=0; $i<$n; $i++) $sum+=$data[$i]; } return $sum/$n; ?> </head> <body> $data[0] = 46; $data[1] = 67; $data[2] = 98; $aver = average(3, $data); echo "$aver"; </body> </html>
善用foreach在函式中處理陣列資料 foreach: 對陣列中所有元素做處理 語法: foreach(陣列 as 變數) //將陣列某一元素存入變數中 { 程式碼; } 範例: 印出陣列$data中所有資料 <html> <head> <title>PHP範例程式</title> </head> <body> <? $data[0] = 46; $data[1] = 67; $data[2] = 98; $data["abc"] = "test"; foreach($data as $v) { echo "$v<br>"; } ?> </body> </html>
善用foreach在函式中處理陣列資料 範例: 製作一個函式, 計算陣列中所有數字的平均 function average($data) <html> <head> <title>PHP範例程式</title> <? function average($data) { $sum = 0; $n = 0; foreach($data as $v) $sum+=$v; $n++; } return $sum/$n; ?> </head> <body> $data[0] = 46; $data[1] = 67; $data[2] = 98; $aver = average($data); echo "$aver"; </body> </html>
練習 範例: 製作一個找出陣列中最大數字的函式 function findMax($data) <html> <head> <title>PHP範例程式</title> <? function findMax($data) { //請寫此函式內容 } ?> </head> <body> $data[0] = 46; $data[1] = 97; $data[2] = 90; $max = findMax($data); echo "$max"; //印出97 </body> </html>
利用函式產生HTML語法 範例: 設計一個函式連續貼出四張圖, 可設檔名與寬度 function showImage4($name, $w) <head> <title>PHP範例程式</title> <? function showImage4($name, $w) { for($i=0; $i<4; $i++) echo "<img src='$name' width='$w'>\n"; } ?> </head> <body> showImage4("a.jpg", 120); </body> </html>
練習 範例: 設計一個函式在一個4x4表格中連續貼出16張 圖, 可設檔名與寬度 (showImage4x4.php) function showImage4x4($name, $w) <html> <head> <title>PHP範例程式</title> <? function showImage4x4($name, $w) { //請寫此函式內容! } ?> </head> <body> showImage4x4("a.jpg", 120); </body> </html>
課程大綱 檔案 函式 物件
PHP物件導向 使用類別定義出物件的規格書,之後就可依這個 規格書製作出物件實例,並在製作過程中設定個 別物件的專屬特性資料。 使用自訂類別class建立物件 宣告類別語法: class 類別名稱 { 宣告要用到的變數; //var $變數名稱; 宣告要用到的函式; //函式中要用到前面宣告的變數要用 $this->變數名稱 }; 建立物件語法: $物件名稱 = new 類別名稱; 使用物件內的變數或函式語法: $物件名稱->函式或變數
宣告類別建立物件 範例: 將表單填入的個人資訊(姓名,電話,Email), 以物 件方式做接收與輸出 Person.htm <html> <head> <title>PHP範例程式</title> </head> <body> <form method="post" action="person.php"> Name: <input type="text" name="T1" size="20"><br> Phone: <input type="text" name="T2" size="20"><br> Email: <input type="text" name="T3" size="20"><br> <input type="submit" name="B1" value="ok"> </form> </body> </html>
宣告類別建立物件 Person.php <html> <head> <title>PHP範例程式</title> <? class Person { var $name; var $phone; var $email; function input() $this->name = $_POST['T1']; $this->phone = $_POST['T2']; $this->email = $_POST['T3']; } function output() echo "<table border='1'>\n"; echo "<tr><td>Name:</td><td>$this->name</td></tr>\n"; echo "<tr><td>Phone:</td><td>$this->phone</td></tr>\n"; echo "<tr><td>Email:</td><td>$this->email</td></tr>\n"; echo "</table>\n"; }; ?> </head> <body> $p = new Person; $p->input(); $p->output(); </body> </html> Person.php
宣告類別建立物件 Person.php 也可以這樣設計: <html> <head> <title>PHP範例程式</title> <? class Person { var $name; var $phone; var $email; function output() echo "<table border='1'>\n"; echo "<tr><td>Name:</td><td>$this->name</td></tr>\n"; echo "<tr><td>Phone:</td><td>$this->phone</td></tr>\n"; echo "<tr><td>Email:</td><td>$this->email</td></tr>\n"; echo "</table>\n"; } }; ?> </head> <body> $p = new Person; $p->name = $_POST['T1']; $p->phone = $_POST['T2']; $p->email = $_POST['T3']; $p->output(); </body> </html> Person.php 也可以這樣設計:
建構式: 建立物件自動執行的函式 類別中可宣告一個名稱與類別名稱一樣的函式, 稱建 構式 當建立物件時建構式會自動執行, 通常用來初始化類 別中的變數內容
建構式: 建立物件自動執行的函式 因此Person.php 還可以這樣設計: <html> <head> <title>PHP範例程式</title> <? class Person { var $name; var $phone; var $email; function Person() $this->name = $_POST['T1']; $this->phone = $_POST['T2']; $this->email = $_POST['T3']; } function output() echo "<table border='1'>\n"; echo "<tr><td>Name:</td><td>$this->name</td></tr>\n"; echo "<tr><td>Phone:</td><td>$this->phone</td></tr>\n"; echo "<tr><td>Email:</td><td>$this->email</td></tr>\n"; echo "</table>\n"; }; ?> </head> <body> $p = new Person; $p->output(); </body> </html> 因此Person.php 還可以這樣設計:
練習 自訂一個Image類別, 其中包含: 試著用Image建立一個物件使用裡面包含的貼圖 函式 變數: 函式 var name: 檔名 var width: 寬度 函式 Image(): 建構式, 將name設為a.jpg, width設為120 showImage(): 貼一張圖: showImage4(): 連續貼出四張圖 showImage4x4(): 4x4表格中連續貼出16張圖 試著用Image建立一個物件使用裡面包含的貼圖 函式