第 01 章 - PHP 簡介與初探
上次更新日期 2020/03/05
本系-資訊傳播系-在畢業專案設計時,都會讓所有的組別設計一個動態網站,所謂的『動態』指的不是讓網站的物件變動而已, 而是可以讓網站的內容變動。內容需要變動,那就得要加上資料庫設計才行。而網站連結到資料庫這當中的伺服器網頁程式語言, 有很多種類可以挑選,在台灣,我們經常使用的是 PHP 程式喔!因此,底下我們將會透過 PHP 程式訓練,一項一項慢慢練習學習 PHP。
學習目標:
- 了解 PHP 與 HTML 檔案的相關性
- 了解 PHP 的基本語法
- 了解使用簡單的變數在 PHP 程式碼當中的應用
1.1: PHP 是什麼
在基礎的網站規劃與製作課程中,我們知道 Linux 作業系統、伺服器、伺服器端網頁程式、資料庫、瀏覽器端網頁程式、HTML 與多媒體的相關性, 那個 PHP 指的就是伺服器端的網頁程式!因此,你要學習 PHP 時,就得要架設支援 PHP 的網頁伺服器平台才行。我們這個課程是屬於延續課程, 因此,你得要先查閱一下網站規劃與製作喔!
- 理解 WWW 伺服器/用戶端 (server/client) 與傳輸資料的架構。聽老師講,將底下的元件分別填上所在的位置, 以理解 PHP 這個伺服器端網頁程式語言是作什麼用途的。
PHP 並不像傳統程式語言還需要透過編譯才能執行,而是直接透過直譯式語言,直接撰寫程式碼,然後交給伺服器平台去運作,而無須進行編譯。 所以,PHP 可以直接修改程式碼,並且透過網頁就能直接運行!也因為這樣的特性,因此,你的網頁伺服器就得要支援 PHP 語言後, 你的 PHP 程式碼才能夠正確的運作喔。目前常用的 PHP 版本,有穩定的 PHP5 以及高速運作的 PHP7 兩種, 無論使用那一種,其基本語法都是差不多的。
PHP 怎麼撰寫呢?基本上,你最好直接連線到伺服器,然後透過任何一個純文字編輯器,例如 Linux 上面的 vim 或者是 windows 上面的 notepad++ 等, 當然,你可以使用任何一種連線方式,只要能夠直接編輯網頁上面的文字檔即可。另外,由於 PHP 是伺服器端的網頁程式語言,所以, 你在瀏覽器上面是看不到 PHP 程式碼的!這是因為當你連接到伺服器並且啟動 PHP 指令後,該指令會被伺服器執行, 並且將執行的結果回傳給瀏覽器,因此,瀏覽器只會看到執行後的結果,細節並無法顯示到瀏覽器上!
- 請連結到鳥哥的網頁伺服器繳交作業的網站,請取得 (1)帳號 (2)密碼 (3)連線主機名稱 (3)連線協定 等參數, 並使用 notepad++ 開始透過 ftp 機制連線到作業繳交的網站。
- 請在你的 windows 桌面啟動數個軟體:
- 啟動一個 chrome 瀏覽器,來展示這個上課的教材網站
- 啟動一個 notepad++ 程式編輯器,來登入到伺服器,並且編輯你的 PHP 程式碼檔案
- 啟動一個 chrome 瀏覽器,來展示使用 notepad++ 編輯的 PHP 程式,透過網頁執行來查看成果。
那,為什麼要學習 PHP 呢?其實伺服器端的網頁程式語言還不少,為何我們課程要指定 PHP 來學習?想學什麼?當然就得看市場需求。 我們可以到 w3techs.com 網站去瞧一瞧,目前跟網頁伺服器/用戶端有關的軟體是哪些好了:
在 2020 年的年初,伺服器端的程式語言最大宗還是 PHP (具有 78% 以上),次要的則是 ASP.NET,然後則是 Java!所以, 要學什麼後端程式語言,那還用說?至於用戶端,也就是瀏覽器端使用的程式語言呢?幾乎 95% 以上都是 javascript 了!所以要學什麼, 這就很清楚明白了! ^_^!那如果還想要使用 javascript 的功能,讓前端的畫面變得美美的,目前大家都玩什麼? 你可以看一下上述網站的『 JavaScript Libraries 』部份,前兩大就是 jQuery 與 Bootstrap 囉!所以,這兩個也能玩一玩!
1.2: PHP 程式撰寫方式
就跟我們在網頁規劃與製作的課程中所使用的方式一樣,你需要透過 notepad++ 直接登入伺服器,然後直接在 Server 上面撰寫程式碼! 透過例題 1.1-2 的處理,你應該已經成功的連上了課程所需要的程式撰寫環境。基本上,課程中的所有 PHP 程式,都會被我們寫入到 /www/php 這個目錄下, 以方便管理。現在,就讓我們來處理一下連結到 php 程式碼的首頁吧!
- 先在你的 /www 目錄底下,新建一個名為 php 的目錄;
- 打開 /www/index.html 檔案,在清單裡面新建一個連結,就直接連結到 php/ 即可
- 新建一個檔名 /www/php/index.php,這個檔案的內容有點像這樣:
<!doctype html> <html lang="zh-Hant-TW"> <head> <title>用來學習 PHP 的首頁</title> <meta charset="utf-8" /> <meta name="author" content="鳥哥" /> <link href="overall.css" rel="stylesheet" /> </head> <body> <ul> <li>姓名:鳥哥</li> <li>學號:A070CXXX</li> </ul> <p>各個小程式練習的連結</p> <ul> <li><a href="unit01-1-1.php">第一個 PHP 程式</li> </ul> </body> </html>
- 新建一個檔名 /www/php/overall.css,這個檔案的內容有點像這樣:
body { font-size: 12pt; font-family: 'Times New Roman', '新細明體'; margin: 0; padding: 0; line-height: 1.6em; letter-spacing: 0.05em; } .code { width: 80%; margin: 10px; padding: 10px; border: 1px solid black; background-color: lightyellow; color: darkgreen; }
未來將你的 PHP 程式,同樣的一個連結一個連結的貼上去,就可以了!
- 嵌入式 PHP 的語法
基本上,PHP 的語法與 html 的語法還有點類似,只是將程式碼撰寫到 <?php ... ?> 之間而已~大致上就是這樣寫的:
<?php php 程式碼 ; php 程式碼 ; ...; ?>
撰寫 PHP 程式碼的時候,還有一些基本的知識必須要了解喔:
- 副檔名與撰寫注意事項:
- 網頁副檔名一定要是 .php 才行!否則我們的網頁伺服器並不會知道那是程式語言;
- PHP 的程式碼一定要包含在 <?php xxxxx ?> 當中,其中 xxxx 就是 PHP 程式碼
- PHP 與 HTML 可以整合在一起,亦即上述的 <?php xxxxx ?> 可以出現在網頁的任何一個位置上。
- 程式碼撰寫注意事項:
- 注意每一行指令結尾必須是分號 (;) 喔!
- PHP 程式碼的英文是有大小寫區分的,不能搞錯
- 可以使用『 // 註解內容 』這種方式來增加『單行註解說明』
- 可以使用『 /* .... */ 』這種方式來增加『數行的註解說明』
先來撰寫一下第一隻 PHP 程式,給個 hello PHP 吧!一般來說,初次接觸程式設計的夥伴,第一隻程式大概就是『指揮程式, 讓程式在螢幕上輸出我需要的文字』,那第一個顯示的文字,通常就是我們的程式語言名稱~因此,就來稱呼為『哈囉,PHP』!
而在 php 程式中,將文字或資料印出到螢幕上面的指令,就是使用 echo (回聲),通常語法就是『 echo '純文字資料' 』。 你會發現 echo 是用單引號將一串資料圈起來!那就來處理處理!
- 先建立一個新檔案,檔名就稱為 /www/php/unit01-2-2.php,並將底下的程式碼加入到 body 裡面去;
<?php echo "hello PHP.."; ?>
- 在這個程式碼後面,再加一段 html 文字資料,並將 < 的符號改成網頁文字,亦即使用 < 來寫入到網頁中,
這樣的好處是,可以讓我們未來查詢網頁資訊時,可以直接從網頁上看到我們的純文字程式碼 (其實就是網頁,不是程式碼。)
只是依舊需要支援 HTML 的語法產生網頁!不能只有上面 3 行喔!另外,為了查詢自己的語法,將上述的語法安插到底下的 HTML 裡面去:
<hr /> <pre class="code"> <?php 將上面的程式碼寫入到這裡!方便比對 ?> </pre>
- 修改 /www/php/index.php 的內容,修改/增加這一個檔案的連結到清單當中,然後透過瀏覽器直接瀏覽這個網頁。 網頁資料會有點像這樣:
你可以自己在網頁上面按下右鍵選擇『檢視原始碼』看看,你可以發現 PHP 的程式碼是不會顯現的,而只是顯示出 echo 後面的字串而已。 這就是你的第一隻 PHP 程式!相當簡單吧!
- 顯示運算結果
PHP 還可以進行數學運算的!假設上學期你有 5 科成績,要將成績計算平均,那該如何處理?其實同樣透過 echo 來將結果顯示出來即可, 只是,顯示的資料不是字串,而是數值的運算結果。因為是數值,所以不能加上單引號或雙引號!
- 先建立一個新檔案,檔名就稱為 /www/php/unit01-2-3.php,後續將程式碼寫入 body 當中 (簡單的處理方法是, 請將 unit01-2-2.php 另存新檔成為 unit01-2-3.php,然後將不再需要的部份刪除,再開始處理新程式碼即可);
- 假設你的五科成績要計算平均,運算式先以純文字的方式輸出到螢幕,結果是:
『我的平均成績: (79+85+91+65+88)/5 = 』 - 然後將實際的運算結果輸出
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
這就是透過 PHP 進行運算的結果~事實上,PHP 的運算其實還不算太差~鳥哥曾經用 PHP 的網頁運算功能,取代了 excel 的複雜計算~ 甚至可以達到自動化處理的流程~減輕我工作的負擔!相當方便!那麼 PHP 常見的運算式大致上就是四則運算:
- a + b
- a - b
- a * b
- a / b
- a % b 這個是取餘數,例如 10 % 3 會得到 1 喔!
大概最後一個是比較特別,大家平時沒有注意到的。好了,現在讓我們繼續來想想,你有沒有想過,我們要去 400m 的操場跑步時,基本上, 所謂的 400m 指的都是最內圈,那麼如果你跑最外圈 (崑山操場最外圈是第 8 跑道),跑完一圈會差多少公尺的距離?
- 一般來說,每個跑道的寬度大概是 1.22m,而直線區的距離不會變,會改變的當然就是彎道區。
- 彎道最內圈半徑為 36.8,第二圈則是 36.8 + 1.22 = 38.02 這樣。
- 由於週長的計算為『 2*pi*r 』,所以差異的距離應該是『 2*pi*r1 - 2*pi*r2 = 2*pi*(r1-r2) 』
其中 r1, r2 分別是第 1, 2 圈 - 我們知道每圈距離是 1.22 的差異,所以每圈的距離就會有『 2*pi*1.22 』的距離。
- https://zh.wikipedia.org/wiki/跑道_(体育)
現在,讓我們來計算每個賽道的長度吧!
- 先建立一個新檔案,檔名就稱為 /www/php/unit01-2-4.php,後續將程式碼寫入 body 當中 ;
- 第一行顯示:『第 1 跑道距離: 400m 』
- 第二行顯示:『第 2 跑道距離: (400m + 2*pi*1.22)m』
- 第三行顯示:『第 3 跑道距離: (400m + 2*pi*1.22*2)m 』
- 持續顯示到第 8 跑道即可
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
從上面的範例,我們知道幾件事:
- 單引號或雙引號包含的資料,就是字串。要注意的是,引號要成對!
- 字串與字串之間可以使用小數點『 . 』進行資料的累加
- 承上,可以使用小數點『 . 』累加字串與數值,不過累加之後,該資料就會變成字串
另外,與其他程式不一樣的地方是, PHP 所使用的數值加減或之後會提到的變數運作,都不需要事先宣告! PHP 會依據自己的計算判斷,決定該項目是什麼資料型態喔!如果你覺得計算賽道沒啥有趣,那我們來計算屬於你的身體密碼好了! 現代人還挺注意健康的~因此有所謂的 BMI 值,這個 BMI 的公式是這樣的:
- BMI = W / H2
其中 W 是體重,單位是『公斤』,H 是身高,單位是公尺。因此,當你具有 70 公斤重,且身高為 175 公分,這時你的 BMI 值就是: 70/(1.752), 大約是 22.86 左右。一般成人的 BMI 正常範圍約在 18.5 到 25 之間,亞洲人的體態比較瘦小,因此定義則為 18.5 ~ 24 之間。 現在我們使用 PHP 計算出你的 BMI 值吧!
- 先建立一個新檔案,檔名就稱為 /www/php/unit01-2-5.php,後續將程式碼寫入 body 當中 ;
- 第一行輸出:『我的身高: 1.XXm』
- 第二行輸出:『我的體重: XX.YYkg』
- 第三行輸出:『我的 BMI : xxx.xxx 』
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
很簡單的就完成了我們的程式運算!
1.3: 變數與常數的應用
讓我們回到賽道長度計算的那個小題目,當時我們計算的是 400m 的操場,但是,如果我們想要知道的是國小的 200m 的操場、國中與高中 300m 的操場時, 那不是得要將 400 全部重新改成 200 或 300 嘛?要寫好幾行耶~有沒有辦法快速處理?有的!那就是透過變數來搞定即可。 所謂的『變數』,其實就是拿一個『名字』代表某個東西,之後這個『名字』可以在某些地方被呼叫,當它被呼叫時, 它代表的東西就會被使用上。
這個有點像以前國中玩的 y = a*x + b 之類的運算~其中 y 與 x 就是變數,而 a 與 b 則是實際在計算式當中的數值而已。 因此,當你修改了 x 之後,你的 y 就會跟著變的意思。
PHP 作為變數的設定是有一定規則的,大致上的語法是這樣的:
$var = 123; $var = 1.23; $var = '我是小小鳥'; $var = "我是小呆瓜"; $var = true; // 另一個設定就是 false
基本上,等號左邊稱為變數名稱,右邊稱為此變數的內容。變數名稱的命名規則大致上是這樣:
- 變數名稱一定以錢字號『 $ 』作為開頭;
- 變數的字元組成主要為英文大小寫、數字、底線 (_) 等,盡量不要包含特殊字元,也不要使用中文
- 字元組合的第一個字元必須要英文大小寫,或底線,不可以是數字 (所以 $1st, $2nd 不能用)
- 字元組合的字元大小寫是不同的,所以 $Var 與 $var 或 $VAR 都是獨立不一樣的變數名稱!
- 字元組合的名稱不可以用到 php 保留字,例如 if, and, or, as, do 等等,都不能作為變數名稱
- 變數名稱的字數沒有限制,不過盡量不要產生莫名其妙的文字組合,擔心未來不好理解。
PHP 因為程式當中會用到 if 以及 and, or 這些字,因此就不能拿來作為變數設定。PHP 的保留字還不少,可以參考底下的網頁來查閱所有類型的保留字:
現在,讓我們來測試一下如何應用變數到整個程式碼當中吧!
- 將 /www/php/unit01-2-4.php 另存新檔成為 unit01-3-1.php,然後進行修改
- 第 1, 2 行設定兩個變數,一個指定為 400 ,另一個指定為 3.14 (就是 pi)
- 第 3 行以後,分別顯示『第 1 跑道距離:』連結『 ( $var1 + 2 * $var2 * 1.22 * [0-7]) 這樣
- 上面的 $var1 為 400 數值, $var2 則是 3.14 ,[0-7] 指的是第 1 到第 8 跑道要加上的距離
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
同樣的道理,我們也來處理一下 BMI 的計算,可以自行設定身高與體重才合理!
- 將 /www/php/unit01-2-5.php 另存新檔成為 unit01-3-2.php,然後進行修改
- 第 1, 2 行設定兩個變數,分別是身高與體重
- 第 3 行輸出:『我的身高: 1.XXm』
- 第 4 行輸出:『我的體重: XX.YYkg』
- 第 5 行輸出:『我的 BMI : xxx.xxx 』
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
上面的範例鳥哥做了個簡單的差異處理,在第三行的 echo 中,我將純文字與變數寫在一組雙引號裡面,這是沒有問題的! 雙引號可以讓 $var 的變數內容正常呈現,但是單引號則只能進行純文字的處理!例如底下的範例:
- 將 /www/php/unit01-3-2.php 另存新檔成為 unit01-3-3.php,然後進行修改
- 將 3, 4, 5 行程式碼複製,貼成 6, 7, 8 行,並且將雙引號改成單引號;
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
以最後一行顯示 BMI 的情境來說,因為是直接除,所以原本的雙引號裡面並沒有變數,因此單雙引號就沒有影響。 但是對前兩行來說,單引號就會讓變數名稱變成是一般字元,因此就直接顯示出變數名稱,而不是變數的內容了。所以,在撰寫字串的輸出時, 這點要特別注意。當然啦,如果你都用『 . 』來連結,那就無所謂。
- 設定常數
有時候,某些數字我們不希望他會被亂用~因為變數的內容是可變動的!擔心未來不小心被我們自己給改掉~所以, 這時候就可以設定不會變動的『常數』資料。上面有沒有可以作為範本的?當然有!那就是 pi 這個數值!通常 pi 簡化為 3.14, 但是如果需要精確一點,就可以寫成 3.14159 。如果要定義常數,例如 mypi 作為 3.14159 的話,可以這樣做:
define( mypi, 3.14159 );
常數比較特別,不需要錢字號 ($) 在前面,且一經設定,就不能修改。現在,讓我們持續來調查一下賽道的長度吧。
- 將 /www/php/unit01-3-1.php 另存新檔成為 unit01-3-4.php,然後進行修改
- 將第 2 行 $mypi = 3.14 改成常數指定,成為:『 define( mypi, 3.14) 』
- 修改第 3 行以後的程式碼,將 $mypi 都拿掉錢字號,只剩下 mypi 而已
- 將 $mybasic 到最後一行複製,並貼上最底部,將這部份的 define 這行定義拿掉,並將 400 改成 300,且只剩下 6 跑道的資料
- 再一次將 $mybasic 到最後一行複製,並貼上最底部,並將 400 改成 200,且只剩下 5 跑道的資料,且將 mypi 重新指定為 3.14159 (確認是否可行)
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
由這個案例,我們可以理解到,程式碼幾乎不用變,只要修改變數,許多資料就會跟著改變!相當輕鬆愉快! 但是,常數不行~常數一經設定,就不能亂改!這個對於程式撰寫也有很大的幫助!某些我們比較重要的定義,不能亂改的! 就可以透過這個常數的功能來統一指定~也能防止自己阿呆時的錯誤資料填寫!
1.4: PHP 的系統變數與取得用戶變數值
PHP 會有自己與關於 Server 的預設變數,呼叫這些特別變數的方法,需要透過『 $_SERVER['var'] 』的情境來處理, 大寫的部份是固定的,不能變,小寫的部份則是 PHP 提供的某些資訊。常見的 var 有底下這些:
- PHP_SELF 目前的 PHP 檔名
- SERVER_NAME 伺服器的名稱
- REQUEST_METHOD 資料傳遞的方法
- REMOTE_ADDR 用戶端主機的 IP 位址
- SCRIPT_FILENAME 檔案在伺服器的實際位置
- 先建立一個新檔案,檔名就稱為 /www/php/unit01-4-1.php,後續將程式碼寫入 body 當中 ;
- 以 echo 的方法,將上面五個變數,以類似 $_SERVER['PHP_SELF'] 的方式顯示到螢幕上
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
基本上, PHP_SELF 與 REMOTE_ADDR 還挺常用的!所以可以稍微記憶一下喔!另外,你也會發現,不同的 IP 位址連線到同一個網頁, PHP 可以透過 REMOTE_ADDR 去知道用戶端的 IP 哩!也就是說,其實用戶端應該是可以傳輸資料給 PHP 的!
- 使用 GET 方式取得用戶上傳的變數
你可能會發現到,有時候網址列會是這樣:『 http://remote.host.name/somefile.php?var=content 』,亦即是在檔名後面, 先加上問號之後,以變數設定的方式,指定變數與變數值。對!這就是使用 GET 的方式,透過網址,將使用者需要的資料丟到伺服器, 再由伺服器的 PHP 去抓下來處理。
不過,要將變數資料從網址列抓下來,就得要使用一些比較特別的方法。以 GET 的方式來說,如上的變數名稱 var 要抓下來,就得要這樣做:
$phpvar = $_GET['var'];
那個 $phpvar 是 PHP 裡面再設定一個變數名稱,這個變數名稱也可以跟網頁的變數名稱相同,亦即也能用『 $var = $_GET['var']; 』, 這邊為了幫大家理解,所以就使用不同的變數名稱來介紹。我們同樣以賽道資訊來說明一下,假設操場的賽道標準長度為 400, 300, 200 這三種, 我想要透過設定一個 mybaic 變數,且透過網址列直接傳輸時,就得要透過上述的 $_GET['mybasic'] 來將變數內容抓下來才行。
- 將 /www/php/unit01-3-4.php 另存新檔成為 unit01-4-2.php,然後進行修改
- 將 300 公尺以後的程式碼部份刪除,只保留原本 400 公尺的資料輸出,以及常數的定義。
- 將 $mybasic = 400 改成『 $mybasic = $_GET['mybasic']; 』的模樣;
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 這個檔案的執行,應該是『 unit01-4-2.php?mybasic=400 』才對,亦即加上變數與內容。
- 在 /www/php/index.php 加入這個程式的連結
我們要計算 BMI 值的時候,其實是需要兩個變數的,分別是身高與體重。那處理 BMI 的計算,又該如何處理呢?兩個變數的話, 應該要使用『 ?var1=con1&var2=con2 』這樣格式,亦即兩個變數間,使用 & 相連即可喔!
- 將 /www/php/unit01-3-2.php 另存新檔成為 unit01-4-3.php,然後進行修改
- 將前兩行的直接變數設定,改成透過 $_GET 的方式抓下來;
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 這個檔案的執行,應該是『 unit01-4-3.php?myh=175&myw=75 』才對,亦即加上變數與內容。
- 在 /www/php/index.php 加入這個程式的連結
一般人還是習慣使用公分為單位去記憶自己的身高,所以這裡讓使用者輸入的資料就寫為 cm, 而在程式碼當中在除以 100 取得公尺的單位,也是個符合使用者概念的方式!
1.5: 參考資料
- Wiki 的 PHP 說明:https://zh.wikipedia.org/wiki/PHP