主題:PHP教學
作者:宥晰
PHP (Hypertext Preprocessor)
PHP的功能主要有兩個:1、與使用者互動,2、與資料庫互動。
此互動發生在伺服器端(使用者端的互動一般是使用javascript)。這裡所謂的互動就是交換資料,在php中使用者通常是使用表單或是網址列傳達資訊給伺服器,而伺服器則以新的網頁頁面來做為回應。
換言之,php算是伺服器裡的一個「造網頁」+「查資料庫」的程式。
宣告方式:
|
<?php |
<? PHP |
<? |
<script language=”PHP”> |
常用的方式就這兩種:「<?……?>」、「<?php……?>」;另外,要使用「<?……?>」這種表示法,必需php.ini檔案內容中的的以下這行 「short_open_tag = On」設定為”on”才可以使用。( 通常預設是on,不過Xampp預設是off )
一旦進入<?php……?>裡(進入PHP結界)就必需用使php的語法。所有在php裡的運算都發生在伺服器裡,過程中使用者並不會接收到任何頁面(雖然運算時間通常極短),當伺服器運算後並且造好頁面才會將整個頁面傳 送給使用者。
註:php預設會開啟輸出緩存,如同預設先執行了ob_start()指令,因此所有的輸出內容都將一起送到使用者端(執行效率較高)。若不想開啟緩存,要讓程式出輸內容直接傳給使用者的話,可以修改php.ini檔:implicit_flush=on
//預設是OFF
或者,腳本一開始就先執行「ob_end_clean();」指令。
然而,造頁面就需要打印網頁語法(即打印HTML、JS、CSS)以供使用者端的瀏覽器讀取,打印程式碼的的主要指令是「echo」
註1:echo也可以換成 print “字串” 功能一樣;唯print有回傳值而echo沒有回傳值。
(print若有印出東西時會回傳1,打印失敗回傳0;可置於if函數中做為邏輯判斷使用)
註2:檔案的副檔名必需為php,這樣伺服器才能知道內容有PHP碼哦!
註3:php每個指令句必需使用分號「;」作為結尾。
PHP檔裡不要求得只能有php語法
<HTML>
|
輸出: I’m here in the PHP!
|
上例中可以發現到裡頭有許多html碼並不是用echo的方式打印出來的。當我們離開PHP時,此時頁面就如同在html檔裡一般,可以直接使用html碼;而php可以隨時打開它的結界,安插php碼在html語法當中。但有個例外:
如果php的完整語法進行到一半,此時離開了php進到html的語法中,php仍是會把中間段的html碼視為php完整語句中的一部分。例如:
<?php
if($GET[‘page’]==3) { ?>
<span>目前在第三頁</span>
<?php } ?>
上例中的「<span>目前在第三頁</span>」仍屬於php中「if條件句」中一部分。
由於php碼會在其它語法(html、js…)中到處亂竄,因此用「<?php……?>」表示法較好,這樣能讓我們更容易找到它們。(也能避免伺服器不支援這樣的用法,雖然可以自行調整php.ini,但有些免費伺服器不提供這類的修改哦!)
認識echo
echo是要幫我們打印頁面的指令。換言之,echo所打印的內容才會成為網頁程式碼中的一部分,再配合該頁面中的其它html語法組合成一個完整且合乎語法的網頁頁面,再傳送給使用者。(當然,如果揍起來的語法不是合乎語法,就可能傳個亂碼網頁給使用者囉!)
echo可以打印「字串」、「變數」、「運算式」、「函數回傳值」…等;為了方便理解,我們可以把上述的引號內的元素都視為「字串」,例如:把「變數」視為一串字串,運算結果也視為一個字串。
字串必需放在引號「”」或「’」之間;不同的字串可以使用「.」把它們串起來成為較長的字串。例如:
|
$abc=”一個字串”; |
會印出: |
其中,雙引號可以辨別字串中的「變數」(變數前後需要留一空格才能判讀,或者,使用大括號把變數包起)。(3+5)是運算式,即使用了雙引號仍是無法判讀。而單引號中的內容全會被視為字串。
註:「.」與「+、–、*、/、%」同屬於運算子,「.」屬於字串的運算子。
由於網頁中常常會需要安插一小段php碼於html語法當中(通常是為了打印變數),此時就可以使用簡化版的打印方式。例如:
<?= $abc ?>等同於<?php echo $abc ?>
上例中的$abc是個變數。以上列的操作方式即使句尾不加「;」也不算錯誤語法,結尾符號(?>)前可以省略句子的結尾。在css的語法中也允許這類的操作,例如屬性內容需要分號結尾,但在大括號”}”前的那一句可以省略,也可以省略最後一句的分號。
(哎呀!說了那麼多就為了偷懶,+_+,培養好習慣,還是都加分號吧!)
關於註解
php中的註解方式有兩種:
一、行註解「//」:它會註解掉該行後面的資料。
二、區域註解「/*註解內容*/」:它會註解掉兩符號之間的內容。
合併上面兩種註解方式,可以巧妙地製作一個區塊註解開關「//*/」,以便於偵錯時使用。方法如下:
//*/ 註記區一 目前資料並沒有被註記忽略,僅註記了本行
要被註記掉的程式碼…
要被註記掉的程式碼…
要被註記掉的程式碼…
要被註記掉的程式碼…
//*/ 註記區一,目前資料並沒有被註記忽略,僅註記了本行
拿掉最前面的一個斜線後,才區者才會被註記忽略
/*/ 註記區一 此時,整個註記區都將被忽略了
要被註記掉的程式碼…
要被註記掉的程式碼…
要被註記掉的程式碼…
要被註記掉的程式碼…
//*/ 註記區一
關於變數
變數以「$」為開頭,內存在記憶體位址(位址是給電腦看的,是記憶體的機械代碼),不過,我們不需要知道位址是啥,只需要知道變數名稱即可;換言之,我們只需為變數命名,好讓電腦依此名稱去尋找記憶體位址。變數的值將會存放在這個記憶體位址後面。
此處提到三個的名詞「位址」、「變數名」、「變數值」,我們可以這樣理解,類似windows系統說G
變數名=捷徑;位址=檔案資料夾;變數值=檔案。
當宣告「$abc=”這是一個字串”;」後,其中「$abc」是變數名;而「這是一個字串」是變數值,$abc內存放的位址是供伺服器電腦看的,電腦記的是位址而我們記的是變數名。
程式把「值」指定給「變數名」時,電腦會將該值存放到變數的位址後面,其後程式中使用到這個變數名時,電腦為幫忙到指定的記憶體位址中取得該值回傳。
註:把值設給變數名的動作稱為「賦值」,所使用的運算子是等號(=)。
PHP的變數可以存放的資料型態有:「數值」、「字串」、「數列(array)」(或譯:數組)、「物件(object)」(或譯:對象)、「資源(resource)」…等。
變數宣告 (或稱指定變數、賦值變數)
只要指定值(含空值)給帶有「$」符號的字串,即是宣告了變數。例如:「$ABC=””;」即賦值空字串給$ABC;若改為「$ABC=123;」稱為賦值123給$ABC,也就是讓「$ABC」存放著數字「123」。
這些值將存放在記憶體位址後,會因程式運算而不斷地被改變,因此稱它為變數。賦值變數時也可以運算式,例如:
$ABC=($AA+$BB)/4;
(即是運算後的結果賦值給變數$ABC
)
註:賦值變數是使用「=」,判斷兩邊資料是否相等時使用的是「==」
關於傳值或傳址指定
前述的賦值方式都是以傳值的方式,也就利用「=」把其後面的值傳給該變數;例如:
$A=111;
$B=$A; $C=$A;
此時三個變數都是存著111這個值,而這個值是分別存放在三個不同的位址裡。若想傳址必需改為這樣寫 $B=&$A(前面多個「&」符號),此時$A與$B同址,此時三變數只用了兩個位址($C不同址)。由於$A與$B同址,若值被修改了,兩個變數也會同步變化。
在php中,函式內與函式外是不同的區塊,它們可以取相同的變數名稱,該變數將被給於不同的記憶體位址。不過,函式內看不到函式外的變數,反之亦然。
由於函式內外的變數不能互通,若想讓彼此資料交流的話,就需要使用到傳址,也就是把函式外的變數以傳址的方式傳給函數,如此一來兩個變數都是使用同一個位址,自然就有互通囉!參考下例:
$abc=’我是字串‘;
|
輸出:
|
註:用大括號包住變數才能讓雙引號認出它是變數,亦可改用「.」來串連字串。
變更資料型態 (settype、gettype)
當我們在宣告變數時其實已經指定了資料型態,例如:
$A=’abc’; //此時,以指定變數$A為字串型態。
不過,有些時候仍是會有需要再把變數型態再明確化,例如:
$A=(int)($B/4); //如此才能確保所賦的值個整數。
註:此方法,僅是傳給$A的值改了型態,$B仍是保留原本型態哦!
gettype($變數名稱):用來獲取變數型態的函式
gettype()通常是偵錯時使用,會使用echo指令來打印回傳值。不過,更常使用的是var_dump()函式,var_dump是專門用來打印變數的函式,不論是一般型態的變數或是陣列型的的變數都可以直接印出,不需再搭配echo指令。var_drum()可以同時放入許多變數,變數以逗號分隔,將來一同被打印到頁面中,可以一次性地看到所有變數的型態及其值。
設定變數型態的方式除了前面以(int)的方式指定外,還可以用
settyep($變數名稱,資料型態),以settype()函數來設定。
此設定會直接改變該變數的型態,不像(int)$ABC僅是回傳更變後的型態。
settype()的回傳值是boolean值(TRUE或FALSE),即設定成功與否。
$abc=’我是字串‘;
|
輸出結果:array
|
說明:$abc的值是字串,也將成功被轉成數字型態了;
|
若只想取出特定型態的資料而不打算更變原變數型態時,可使用下列函數:
intval() |
floatval() |
Strval() |
boolval() |
取為整數 |
取為浮點數 |
取為字串 |
取為布林型態 |
settype是直接把變數轉換型態,而intval($ABC)只是取值,效果同(int)$ABC。
當無法把字串轉為數字時,則回傳0;
特殊:可變變數 (以變數值去命名變數~~真不知道怎麼用它=_=|||)
$abc=’我是字串‘;
|
輸出:我是字串
|
註:PHP的變數與常量都有區分大小寫 (函數名則不分大小寫);
變數名稱必需以英文字母或底線( _)做為開頭。
附上變數型態表以便查閱
資料型態 |
識別字 |
說明 |
整數 |
integer、int |
-2147483647 ~ |
雙精確數 |
double、float、real |
雙精確數、浮點數、實數 |
字串 |
string |
必須用 “ “ 包含 |
布林值 |
Boolean |
真(T/1)、假(F/0) |
陣列 |
array |
存放整組資料 |
物件 |
object |
|
資源 |
resource |
用來保存對外部資料的引用 |
空值 |
NULL |
未設資料的變數值 |
邏輯式判斷型態的函數(全都回傳boolen值)
|
is_int() |
is_float() |
is_array() |
is_null() |
|
is_resource() |
is_bool() |
is_string() |
|
resource(資源),指:CSS、Javascript、外部連結、資料庫…之類的資源
isset($變數):判斷變數是否存在的函數,回傳bool值。
unset($變數):重設變數的函數,即將變數值改為NULL。
關於isset()函式的回傳值,NULL與空字串的回傳結果並不同唷!
對於存放空字串的變數,isset的回傳值是TRUE,因此,想讓它判斷為FALSE的話需使用unset函式,或者,自行將變數賦值為NULL。
好用的函式var_dump($變數)、print_r($變數)
var_dump()可以幫我們印出任何的變數,除了印出資料內容外也一併印資料型態、資料長度、內容筆數、所在的行…等資料,是個偵錯的好幫手。當你對某變數值或型態不確定時,或是對於表單傳來的資料不確定時,都可以使用它來幫忙。
print_r()是專面用來打印array的函式,不過它沒有排版,會讓畫面感覺很亂,只好自己印<pre>囉!例:
echo “<pre>”.print_r($_POST,true). “</pre>”;exit;
在文件開始處寫入這一行,即可知道表單傳來的內容。
註:exit將中止程式,可視需要使用。不想使用時可先註記掉此行
套裝軟體Ampps中的php預設會幫var_dump()所列印的內容前後加上<pre>標籤,並且套用專屬的css樣式讓字串變色以利於閱讀,也讓陣列以樹狀型態印出。
Xampp似乎沒有幫忙加上<pre>標籤,因為若想讓var_dump()的輸出內容排版好看一點,就自己加上<pre>吧!例:
echo “<pre>”;var_dump($aa,$bb,$cc);
echo“</pre>”;
若是覺得這樣要寫成三句很麻煩,就自行把它置作成自定函式吧!
定界符(<<<) 真是個神奇的玩意兒
|
$ABC=”我是變數“; |
輸出: 即使內容有“或‘都會被秀出來;
|
定界符可以把一大堆內容(含換行符號、跳脫字元、變數…)
全都不失真地傳給變數$B,很適合用來存放「大型且有排版的文字」
上例定界符中說到,其內容可以包含特殊字串並且如實印出,一般情況下,引號「”」是用來包含字串的字元,如果字串中想要印出引號時就必需使用跳脫字元「\”」,不然程式會產生誤判。
以下即是所謂的特殊字串
跳脫字元 |
說明 |
跳脫字元 |
說明 |
\’ |
顯示「‘」符號 |
\r |
Return |
\” |
顯示「“」符號 |
\t |
Tab鍵 |
\b |
Backspace鍵 |
\$ |
顯示「$」符號 |
\n |
換行符號 |
\\ |
顯示「\」符號 |
以上字元有的是指令用的字元,因此必需跳脫;而有些功能型的字元並無法用文字表示時,也採用跳脫字元表示。不過,並不表示使用該跳脫字元就真有其功能。
例如:\t並不會有Tab鍵的功能,\n也不見得會換行,畢竟瀏覽器是依<html>語法來換行的。可是,在配合javascript語法時,有時就能發揮功能囉!
定義常數(或譯:常量)
define(“常數名”,常數值)
直接從例子來講:define(“PI”,3.1415926),此後,「PI」字串就變成特殊符號了,PI代表3.1415926這個數值。
常數一旦被定義後,就無法再更改或取消囉!
使用define()函式來定義常數時,常數名必需以雙引號包含。
常數值的型態可為:string、int、float、boolean 四種!
檢查字串是否為常數
defined(“字串”)
defined(‘FILE_READ_MODE’) OR define(‘FILE_READ_MODE’,0644);
中間的「OR(或)」是邏輯判斷的短路用法,若前面為真,則會忽略其後面內容;因此,這段的法語法的思路是:先以defined()判斷該字串是否為常數,若是(回傳true)則不再另行定義,若不是則由我們來定義該常數的值。
|
系統常量 |
輸出: |
printf(“M_PI: %s <br>”, M_PI);printf(“PHP_OS: %s <br>”,PHP_OS); printf(“PHP_VERSION: %s <br>”, PHP_VERSION); |
M_PI: 3.1415926535898PHP_OS: WINNT PHP_VERSION: 5.6.31 |
註:M_PI=圓周率近似值;PHP_OS=作業系統;PHP_VERSION=PHP的版本
魔術常量(此常量非定值,不同環境會變成不同的值)
|
寫個小程式打印一下魔術常量 |
輸出: |
printf(“LINE: %d <br>”, __LINE__);printf(“FILE: %s <br>”, __FILE__); printf(“FUNCTION: %s <br>”, __FUNCTION__); printf(“CLASS: %s <br>”, __CLASS__); printf(“METHOD: %s <br>”, __METHOD__); |
LINE: 28FILE: C:\www\test\note.php FUNCTION: CLASS: METHOD: |
註:後三個打印沒有回傳結果,是因為我並沒有把它放在所屬的條件下(函數、類…)
|
__LINE__ |
目前指令在第幾行 |
|
__FILE__ |
目前檔案在伺服器的實體絕對位址 |
|
__FUNCTION__ |
指令所在的的函數名 |
|
__CLASS__ |
指令所在的的類(class)名 |
|
__METHOD__ |
指令所在的的方法名(類裡的函數) |
註:魔術常量在英文字母的前後都是兩個底線「__」
php中除了有系統常數、魔術常數外,也預設了大量的變數,其中有一些變數所儲存的資料非常實用,在設計上可以直接取來使用。
以下表列一些實用的預設變數,這些變數都是全域變數:
|
預設變數 |
說明 |
||||||||||||||||||||||
|
$_SERVER |
存放伺服器及目前程式的環境資訊的陣列
其實這個變數不只這些內容,以print_r實際印看看即會發現它有 |
||||||||||||||||||||||
|
$_EVN |
環境變數,存放PHP執行環境資訊的陣列 |
||||||||||||||||||||||
|
$_GET |
來源頁面若以網址列傳值,該值會暫存在這個陣列中 |
||||||||||||||||||||||
|
$_POST |
來源頁面的表單以POST傳值,該值會暫存在這個陣列中 |
||||||||||||||||||||||
|
$_SESSION |
設置SESSION時,相關資料都將存放在這個陣列中 |
||||||||||||||||||||||
|
$_COOKIE |
從用戶端所取得的COOKIE資訊,都將存放在這個陣列中 |
||||||||||||||||||||||
|
$_FILES |
以POST上傳檔後,上傳資料的相關資訊存放在這個陣列中 |
||||||||||||||||||||||
|
$_REQUEST |
關於GET、POST、COOKIE、FILES的相關資訊, |
註:常用的$_POST變數內容會在送出網頁時即清空;而$_GET陣列中的內容是以網址列內容而定,若網址一直不變,即使清空了又會馬上再次獲得該值。
