卡比獸 集合

社群:成功同樂會
記者:庭庭
寶可夢系列
摘要報導

寶可夢,是台灣大流行的電玩遊戲。在此,我們分享實況,也歡迎同好。

註:感謝來源,班長,二哥;任天堂公司、精靈寶可夢公司,Niantic, Inc.等。

註:感謝來源,卡卡家族;任天堂公司、精靈寶可夢公司,Niantic, Inc.等。

PHP1:echo、變數、常量

主題:PHP教學
作者:宥晰
PHP (Hypertext Preprocessor)

PHP的功能主要有兩個:1、與使用者互動,2、與資料庫互動。

此互動發生在伺服器端(使用者端的互動一般是使用javascript)。這裡所謂的互動就是交換資料,在php中使用者通常是使用表單或是網址列傳達資訊給伺服器,而伺服器則以新的網頁頁面來做為回應。

換言之,php算是伺服器裡的一個「造網頁」+「查資料庫」的程式。

宣告方式:

<?php
..(PHP
程式碼)
?>

<?

PHP
..(PHP
程式碼)
?>

<?
..(PHP程式碼)
?>

<script language=”PHP”>
..(PHP
程式碼)
</script>

常用的方式就這兩種<?……?>」、「<?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();指令。

然而,造頁面就需要打印網頁語法(即打印HTMLJSCSS)以供使用者端的瀏覽器讀取,打印程式碼的的主要指令是「echo

1echo也可以換 print 字串 功能一樣;唯print有回傳值而echo沒有回傳值。
(print若有印出東西時會回傳1打印失敗回傳0;可置於if函數做為邏輯判斷使用)

2檔案的副檔名必需為php,這樣伺服器才能知道內容PHP碼哦!

3php每個指令必需使分號「;」作為結尾。

PHP檔裡不要求得只能有php語法

<HTML>
<HEAD><TITLE>測試頁</TITLE><meta http-equiv=”Content-Type”content=”text/html; charset=UTF-8″>
</HEAD>
<BODY>
<?php
echo
“I’m here in the PHP!<br>
,and I’ll set a variable
\$ABC<br>”;
$ABC=”I’m fine.”;
?>
<table>
<tr>
<td>Are
you okey ?
</td>
<td>
<?= $ABC?>
</td>
</tr>
</table>
</BODY>
</HTML>

輸出:

I’m here in the PHP!
,and I’ll set a variable $ABC

Are
you okey ?
I’m
fine.

上例中可以發現到裡頭有許多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碼會在其它語法(htmljs)中到處亂竄,因此用「<?php……?>」表示法較好,這樣能讓我們更容易找到它們。(也能避免伺服器不支援這樣的用法,雖然可以自行調整php.ini,但有些免費伺服器不提供這類的修改哦!)

認識echo

echo是要幫我們打印頁面的指令。換言之,echo所打印的內容才會成為網頁程式碼中的一部分,再配合該頁面中的其它html語法組合成一個完整且合乎語法的網頁頁面,再傳送給使用者。(當然,如果揍起來的語法不是合乎語法,就可能傳個亂碼網頁給使用者囉!)

echo可以打印「字串」、「變數」、「運算式」、「函數回傳值」…等;為了方便理解,我們可以把上述的引號內的元素都視為「字串」,例如:把「變數」視為一串字串,運算結果也視為一個字串。

字串必需放在引號「」或「」之間;不同的字串可以使用「.」把它們串起來成為較長的字串。例如:

$abc=”一個字串”;
echo  “這是”.$abc.”<br>3+5=”.(3+5);

會印出:
這是一個字串
3+5=8

其中,雙引號可以辨別字串中的「變數」(變數前後需要留一空格才能判讀,或者,使用大括號把變數包起)(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=’我是字串‘;
echo “在函數外先印一次
abc={$abc}<br>”;
kkk($abc);
echo “在函數外再印一次
abc={$abc}<br>”;
function kkk(&$a)
{//
傳值需求寫在函式中
$abc=”我是數字“;
echo “在函數內印abc={$abc}<br>”;
echo “在函數內印a={$a}<br>”;
$a=”不再是字串“;
echo “在函數內印改a={$a}<br>”;
}
輸出:
在函數外先印一次abc= 我是字串
在函數內印abc= 我是數字
在函數內印a= 我是字串
在函數內印改a= 不再是字串
在函數外再印一次abc= 不再是字串

註:用大括號包住變數才能讓雙引號認出它是變數,亦可用「.」來串連字串。

變更資料型態 (settypegettype)

當我們在宣告變數時其實已經指定了資料型態,例如:
$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(TRUEFALSE),即設定成功與否。

$abc=’我是字串‘;
$arr=array(a,b,c,array(1,2,3,5),e,f,);
$ABC=”123″;
echo gettype($arr).”<br>”;
echo gettype($abc).”<br>”;
echo 
gettype($ABC).”<br>”;
settype($ABC,int);
settype($abc,int);
echo
gettype($ABC).”<br>”;
echo 
gettype($abc).”<br>”;
echo $abc;
echo $ABC;
輸出結果: 
array
string
string
integer
integer
0
123
說明:
$abc的值是字串,也將成功被轉成數字型態了;
不過,它的值卻變成0了;
而字串型態的數值,可以正確地轉為數字型態!

若只想取出特定型態的資料而不打算更變原變數型態時,可使用下列函數:

intval()
floatval()
Strval()
boolval()
取為整數
取為浮點數
取為字串
取為布林型態
settype是直接把變數轉換型態,而intval($ABC)只是取值,效果同(int)$ABC
當無法把字串轉為數字時,則回傳0;
特殊:可變變數 (以變數值去命名變數~~真不知道怎麼用它=_=|||)
$abc=’我是字串‘;
$ABC=”123″;
$K=’abc’;
$D=’ABC’;
echo 
$$K.”<br>”;
echo 
$$D.”<br>”;
輸出:
我是字串
123

 

註:PHP的變數與常量都有區分大小寫 (函數名則不分大小寫)
變數名稱必需以英文字母或底線( _)做為開頭。

附上變數型態表以便查閱

資料型態
識別字
說明
整數

integerint

-2147483647 ~
+2147483647

雙精確數

doublefloatreal

雙精確數、浮點數、實數

字串

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(資源),指:CSSJavascript、外部連結、資料庫…之類的資源

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=<<<AAA
即使內容有都會被秀出來;$ABC(不需前後留空格);
AAA可以任意命名,
結尾的AAA需左緊靠行首。
AAA;//記得這兒要緊靠行首,補上分號
echo “<pre>”.$B.”</pre>”;

輸出:

即使內容有都會被秀出來;
我是變數(不需前後留空格);AAA可以任意命名,
結尾的AAA需左緊靠行首。

 

定界符可以把一大堆內容(含換行符號、跳脫字元、變數…)
全都不失真地傳給變數$B,很適合用來存放「大型且有排版的文字」

上例定界符中說到,其內容可以包含特殊字串並且如實印出,一般情況下,引號「」是用來包含字串的字元,如果字串中想要印出引號時就必需使用跳脫字元「\”」,不然程式會產生誤判。

以下即是所謂的特殊字串

跳脫字元
說明
跳脫字元
說明
\’
顯示「」符號
\r
Return
\”
顯示「」符號
\t
Tab
\b
Backspace
\$
顯示「$」符號
\n
換行符號
\\
顯示「\」符號

以上字元有的是指令用的字元,因此必需跳脫;而有些功能型的字元並無法用文字表示時,也採用跳脫字元表示。不過,並不表示使用該跳脫字元就真有其功能。
例如:\t並不會有Tab鍵的功能,\n也不見得會換行,畢竟瀏覽器是依<html>語法來換行的。可是,在配合javascript語法時,有時就能發揮功能囉!

定義常數(或譯:常量)

define(“常數名”,常數值)

直接從例子來講:define(“PI”,3.1415926),此後,「PI」字串就變成特殊符號了,PI代表3.1415926這個數值。

常數一旦被定義後,就無法再更改或取消囉!

使用define()函式來定義常數時,常數名必需以雙引號包含。
常數值的型態可為:stringintfloatboolean 四種!

檢查字串是否為常數

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.1415926535898

PHP_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: 28

FILE: C:\www\test\note.php

FUNCTION:

CLASS:

METHOD:

註:後三個打印沒有回傳結果,是因為我並沒有把它放在所屬的條件下(函數、類…)

__LINE__

目前指令在第幾行

__FILE__

目前檔案在伺服器的實體絕對位址

__FUNCTION__

指令所在的的函數名

__CLASS__

指令所在的的類(class)

__METHOD__

指令所在的的方法名(類裡的函數)

註:魔術常量在英文字母的前後都是兩個底線「__

 

php中除了有系統常數、魔術常數外,也預設了大量的變數,其中有一些變數所儲存的資料非常實用,在設計上可以直接取來使用。

 

以下表列一些實用的預設變數,這些變數都是全域變數:

預設變數

說明

$_SERVER

存放伺服器及目前程式的環境資訊的陣列

陣列索引

內容資訊

PHP_SELF

目前網頁的虛擬路徑

SERVER_NAME

目前網頁的伺服器名稱

SERVER_PORTOCOL

通訊協定名稱及版本,例:
HTTP/1.0

REQUEST_METHOD

目前頁面請求變數的方法,例:
GET
POST

DOCUMENT_ROOT

頁面所在網站的根目錄

HTTP_HOST

頁面所在的伺服器位址

REMOTE_ADDR

目前網頁客戶端的IP

REMOTE_PORT

目前網頁客戶端的連接埠

SCRITP_FILENAME

目前頁面的絕對路徑

SERVER_PORT

目前網頁伺服器的連接埠

其實這個變數不只這些內容,以print_r實際印看看即會發現它有
37
個元素,隨著版本及網頁需求的改變也許將來還會更多。

$_EVN

環境變數,存放PHP執行環境資訊的陣列

$_GET

來源頁面若以網址列傳值,該值會暫存在這個陣列中

$_POST

來源頁面的表單以POST傳值,該值會暫存在這個陣列中

$_SESSION

設置SESSION時,相關資料都將存放在這個陣列中

$_COOKIE

從用戶端所取得的COOKIE資訊,都將存放在這個陣列中

$_FILES

POST上傳檔後,上傳資料的相關資訊存放在這個陣列中

$_REQUEST

關於GETPOSTCOOKIEFILES的相關資訊,
這個陣列也都留有一份。

註:常用的$_POST變數內容會在送出網頁時即清空;而$_GET陣列中的內容是以網址列內容而定,若網址一直不變,即使清空了又會馬上再次獲得該值。