PHP
PHP 基礎
1. php 簡介
PHP,即 PHP: Hypertext Preprocessor,是一種被廣泛應用的開源通用指令碼語言,尤其適用於 Web 開發並可嵌入 HTML 中。
它的語法利用了 C、Java 和 Perl,易於學習。
該語言的主要目標是允許 web 開發人員快速編寫動態生成的 web 頁面,但 PHP 的用途遠不只於此。
2. php 概述與名詞解釋
2.1 基本語法與名詞解釋
php標記:當 php 開始解析一個檔時,會尋找起始和結束標記,也就是 <?php 和 <font
color=’red’>?>。
這告訴 php 開始和停止解析二者之間的代碼。
此種解析方式使得 php 可以被嵌入到各種不同的文檔中,而任何起始和結束標記之外的部分都會被 php 解析器忽略。
分隔符號: php 需要在每個語句後用分號;結束指令,需要注意的是必須採用英文輸出。
注釋方法: php 的注釋雖然支持 c、c++、unix shell 風格等的注釋方法,但我們仍然保持在 js 中的注釋風格即可,其餘注釋方法暫且不提。
輸出方法: echo 命令表示輸出,而寫在 echo 後面的代碼能夠直接被顯示出來。
2.2 變數
- 描述:變數是其所表示的值可以發生改變的量,
在 php 中的變數用一個美元符號後面跟變數名來表示。 - 語法:$變數名稱
- 規則:變數名稱與 php 中其它的標籤一樣遵循相同的規則。
一個有效的變數名由字母或底線開頭,後面跟上任意數量的字母,數位,或底線。 - 注意:
(1)php中變數名稱是大小寫敏感的
(2)php中變數可以直接在寫出變數名稱後直接使用,而不需要 js 中的 “聲明賦值”過程。
(3)php中變數之間的賦值總是【賦值傳遞】,如果必須【地址傳遞】則需要使用&符號
(4)php中變數的作用域採用函數級作用域(暫時)。 - 例子:
$var='allen'; $Var=' welcome!'; echo "$var,$Var"; // 輸出 "allen welcome!" - 動態變數 Variable variables
剛接觸
PHP的人一定會覺得很奇怪,會什麼變數(variables)前面都要帶$為什麼不像java或者其他語言,變數名直接拿來用呢? 後來才知道PHP支援Dynamic variables 動態變數i.evariable variables的功能。<?php $hello = 'world'; $world = 'hello'; echo $world . "n"; //輸出: world ?>PHP會把${$world}的值拿出來替換,因此變數成為$hello,所以output就是 ‘world’ 字串。但太多的$...$轉換會造成代碼理解的困難。例如:
<?php $Bar = "a"; $Foo = "Bar"; $World = "Foo"; $Hello = "World"; $a = "Hello"; echo $a; //輸出: Hello echo $a; //輸出: World echo $$a; //輸出: Foo echo $$a; //輸出: Bar echo $$$a; // 輸出 a echo $$$a; //輸出: Hello echo $$$$a; //輸出: World : //..... 等 ....// ?>後面維護的人員應該會想罵人吧~~
何時使用動態變數
for-loop中最常使用到動態變數Variable variables,例如:php_動態變數.php<?php // price name list $priceNameList = array('Original', 'VIP', 'Employee'); // price list $priceList = array(300, 200, 100); $total = count($priceList); // dump priceList to meaningful variable name; for ($i=0; $i < $total; $i++) { //動態變數名稱 $priceOriginal,$priceVIP,$priceEmployee ${'price'.$priceNameList[$i]} = $priceList[$i]; } echo 'oringial price: ' . $priceOriginal . "n"; ?>
2.3 常數
- 描述:常數指在腳本執行期間該值不能改變的識別字。
常數預設為大小寫敏感,傳統上常數識別字總是大寫的。 - 語法:define(‘常數名稱’, ‘簡單值’);
- 規則:常數名稱和其它任何 PHP 標籤遵循同樣的命名規則。
合法的常數名稱以字母或底線開始,後面跟著任何字母,數位或底線。 - 注意:
(1) 常數實際上可以認為是【巨集定義】在php中的一個體現
(2) 為了區分變數和常數,我們約定常數在定義時均使用大寫
(3) php 中實際上並不是所有的常數的值都不能改變,MC(魔術常數)就能夠發生改變。 - 例子:
define('FRANK', '沃德田·辣麼帥'); echo FRANK;魔術常數: 這些常數的值會隨著它們在代碼中的位置改變而改變,這些魔術常數不區分大小寫,如下:
魔術常數 說明 LINE 取得運行程式的行號。 FILE 取得文件在本機的路徑與檔名。 DIR 取得文件在本機的路徑。除非是根目錄,否則目錄路徑名稱不包括最後的「/」符號。(PHP 5.3新功能) FUNCTION 取得函數的名稱(PHP 4.3.0 新增)。自PHP 5 起返回的函數名稱即是原定義名稱,英文字母區分大小寫。 CLASS 取得類別名稱(PHP 4.3.0 新增)。自PHP 5 起返回的類別名稱即是原定義名稱,英文字母區分大小寫。 METHOD 取得類別的方法名稱(PHP 5.0.0 新增)。返回的方法名稱即是原定義名稱,英文字母區分大小寫。 NAMESPACE 取得區分大小寫的命名空間名稱(PHP 5.3.0 新增)。 - 範例:
magicConst.php
2.4 運算式
- 描述:運算式是 php 中的基石,可以說在 php 中縮寫的任何內容都是運算式。
官方給出的概念是【任何有值的東西均可以稱為是運算式】 - 語法:在 php 中運算式無法精確的被給出一個語法來設定,但可以簡單設立一個通俗的標準。
那就是語句如果不加分號的部分,就是運算式。 - 注意:
上面的說法並不完全準確,畢竟有一些語句是不使用分號結尾的。
例如流程控制中的 if 等結構,還有函數等結構。
因此上面的說法只是 “簡單” 設立的一個標準。 - 例子:
function foo(){ return 5;} //函數運算式 $c = $a++; //賦值運算式
3. php 常見資料類型
php 中的資料類型相較於 js 多了很多種,但其中相當一部分對於我們來說鮮少用到。因此我們只在這為大家介紹常見的幾種資料類型。
介紹資料類型之前,為大家提供兩個方法來判別變數的資料類型:
var_dump(變數|運算式):函數用來查看運算式的值和歸屬類型。
gettype(變數|運算式):函數用來查看變數或運算式的類型。
3.1 布林類型:Boolean
- 描述: boolean 是最簡單數值型別,用來表示運算式的真值。
- 語法: 一般使用
TRUE或FALSE常數來指定布林值,兩者均不區分大小寫 - 注意:
a. 可以使用 (bool) 或<font
color=’red’> (boolean) 強制轉換修飾符,來對非布林數值型別的變數或運算式進行強制類型轉換。
b. 當轉換為布林數值型別時,以下值被認為是 FALSE- 布林值 FALSE 本身
- 整型值 0(零)
- 浮點型值 0.0(零)
- 空字串,以及字串 “0”
- 不包括任何元素的陣列
- 特殊類型 NULL(包括尚未賦值的變數)
c. 所有其它值都被認為是 TRUE(包括任何資源 和 NAN)
- 強調:
-1 和其它非零值(不論正負)一樣,被認為是 TRUE
3.2 整數類型:Integer
- 描述:整數指的是集合 ℤ = {…, -2, -1, 0, 1, 2, …} 中的某個數
- 語法:
a. 整數值可以使用十進位,十六進位,八進制或二進位表示,
前面可以加上可選的符號(- 或者 +)。
b. 二進位表達的 integer 自PHP 5.4.0起可用。
c. 要使用八進制表達,數位前必須加上0(零)。
要使用十六進位表達,數位前必須加上0x。
要使用二進位表達,數位前必須加上0b。 - 注意:
a. PHP7 以前的版本,如果向八進位數傳遞了一個非法數字(即 8 或 9),
則後面其餘數字會被忽略。PHP7 以後,會產生Parse Error錯誤
b. PHP 中沒有整除的運算子。 1/2 產生出 float 0.5。
c. 使用(int)或<font
color=’red’>(integer)方法對非整數變數或運算式進行強制類型轉換 - 強調:
絕不要將未知的分數強制轉換為 integer,這樣有時會導致不可預料的結果。
3.3 浮點類型:Float
- 描述:浮點類型,又被稱為浮點數 Float或者雙精度數 double 或者實數 real。
- 語法:可以通過一下任何一種類型來定義
$a = 1.234;
$b = 1.2e3;
$c = 7E-10; - 注意:
a. 永遠不要直接比較兩個浮點數的大小,因為這樣沒有任何意義
b. 如果必須比較浮點數大小,則可以採用【epsilon】機器極小值方式進行比較。
c. NAN表示數學上無法用浮點數具體描述出的數字,
和true之外的任何值進行鬆散或嚴格比較的結果都會是false。 - 強調:
由於 NAN 代表著任何不同值,不應拿 NAN 去和其它值進行比較,包括其自身 。
3.4 字元類型:String
- 描述:字元類型也叫字串類型,是由一系列字元構成。
其中每一個字元等同於一個位元組,因此 php 中只能支援 256 字元集,
也正因為這樣其不支持Unicode。 - 語法:php 中字串有兩種定義語法,
單引號和雙引號定義。 - 注意:
a. php 字串中使用轉義字元來描述容易引起歧義的內容
b. php 對雙引號定義的字串中的變數可以進行內容解析,而單引號則不行。
c. php 字串允許多行定義,但會忽略多餘的空格和換行。
d. php中字串拼接採用.點運算子實現! 不是+加號 - 例子:
$frank = '張先森'; echo 'my name is $frank'."<br/>"; echo "my name is $frank"; echo與print的差異- 比較
print和echo函式的執行速度差異。print.vs.echo結果:
Use 'echo': 0.065550088882446
Use 'print': 0.080870151519775 print和echo兩個函數的用法差異。PHP中echo和print的功能基本相同(輸出),但是兩者之間還是有細微差別的。
echo輸出後沒有返回值,但print有返回值,當其執行失敗時返回flase。 因此可以作為一個普通函數來使用。
這意味著print可用在一些複雜的運算式中,而echo則不行。但是,因為echo語句不要求返回任何數值,所以在代碼中echo語句的運行效率要略微快於print語句。echo可以輸出多個字串,像下面這樣:
echo 'a','b','c';或echo ('a'),('b'),('c');但不可為echo ('a','b','c');print只能輸出一個字串,它可以表現得像一個函式,比如你可以如下使用:
echo $r = print "Hello World ";成功印出 “Hello World ” 後會再接收到一個值1
<?php $a='hello ';$b='php world!';echo $a,$b.'<br />';//echo 可以用逗號分隔字串變數來顯示 print $a.$b.'<br />';//而print不能使用逗號,只能用點號分隔, //print $a,$b.'<br />';//這裡使用逗號時報錯。 ?>
- 比較
heredoc
一般 PHP 會將要輸出的 HTML 用單引號或雙引號包起來,單引號和雙引號的差異是在雙引號內可以使用 PHP 變數,單引號則不行。
但是如果很長的一段 HTML,會顯得程式碼不易維護,此時可以使用 heredoc 語法,
- 例子:
<<<EndOfDoc <!DOCTYPE html> <html> <head><title>TITLE</title></head> </html> EndOfDoc;
使用 <<< 語法要特別注意的是:
- EndOfDoc 是標籤名稱可自定,但上下要一樣
- 開始標籤名稱可加單引號或雙引號,加單引號後其內容不支援 PHP 變數,加雙引號與不加雙引號是相同的功能。
- 開始的標籤名稱後面不可有任何字元,包括空白。
- 結束的標籤名稱要使用分號結尾,前後都不得有空白。
- 例子:
<?php $myLanguage = "PHP"; $ShowStr = <<<Msg 我最喜歡的網頁程式語言是: $myLanguage <br /> 許多學生都說: "It's easy, It's good." Msg; echo $ShowStr; ?>
nowdoc
若要在頁面上顯示程式的原始碼,就須改用 nowdoc 語法(PHP 5.3 新增),表示方法的結構
與 heredoc 相同,不同的是 nowdoc 對於內容中變數及跳脫字元不會進行編譯,而是直接顯示字串內容。
- 格式
$變數名稱 = <<<'自訂名稱' 字串內容........... ............... 自訂名稱;
注意
nowdoc 語法結構表示法定義字串時,起始的自訂名稱前後要加上單引號', 結尾的自訂名稱就不用。
- 例子:
<?php $myLanguage = "PHP"; $ShowStr = <<<'Msg' 我最喜歡的網頁程式語言是: $myLanguage <br /> 許多學生都說: "It's easy, It's good." Msg; echo $ShowStr; ?>
3.5 陣列類型:Array
- 描述:php 中的陣列實際上一個有序映射,映射就是把 keys 關聯到 values上的類型。
- 語法:
array( key => value , … )
// 鍵(key)可是是一個整數integer或字串string
// 值(value)可以是任意類型的值 。
自php 5.4起,可以直接通過短陣列定義方式[]來替代array()。 - 注意:
a. php 中 echo僅用來輸出簡單值,而複雜資料類型則需要通過print_r()函數來輸出
b. php 中的陣列實際上更相似與 js中的物件結構。
c. php 中陣列的讀取和賦值可以通過陣列名稱[鍵名]方式來讀寫。
d. php 中陣列的長度讀取通過 count() 函數實現
e. php 中陣列內部添加原本並不存在的 key 值,不會補齊之間的差值,
而是僅添加當前新輸入的 key 值。例:$arr[100] = 100.並不會為陣列添加 100 個元素 - 例子:
print_r($frank = ['11','22','33']); print_r($frank[0]); $frank[100] = 960; print_r($frank); echo count($frank);
3.6 對象類型:Object
- 描述: php 中想要創建一個物件,則必須通過 new 語句產生實體一個類別得到。
- 語法:$obj = new Func;
- 注意:
a. php 中類別由class關鍵字聲明,類別名稱後沒有小括弧。
b. php 中類別內部的方法由->箭頭來調用,而不是.點運算子。 - 例子:
class Peo{ function eat(){ echo '我會吃飯'; } } $frank = new Peo; print_r($frank->eat()); - 補充:對於類別和物件的使用方法遠不止如此,而在資料類型當中我們只需要知道物件類型是如何創建的即可,剩餘部分會在類別和物件中詳細說明。
3.7 空數值型別:NULL
- 描述: NULL 表示變數未被賦值的狀態,NULL 類型唯一可能的值就是 NULL。
- 注意: NULL 值不區分大小寫,NULL 或 null 都可以
- 例子:
echo $a; //Undefined variable $temp = null; var_dump($temp); // NULL echo "<script> var a; console.log(a); </script>"; var_dump($frank = NULL); //NULL
3.8 資源型別
資源通常是利用特殊的函數所傳回代表資源的值。因為資源型別的變數,其值建構的方法包含了如檔案處理、資料庫處理或繪圖處理等動作的內容,所以是無法由其他的資料型別轉換而來的。
- 例子:
$conn = mysqli_connect("localhost:3306", "root", "1qaz@wsx"); $conn = null;
4. php 運算子
php 中運算子和 js 中的運算子大同小異,因此整體上來講可以直接按照經驗進行使用。但畢竟存在差別,因此列出兩個明顯的運算規則區別:
4.1 字串的拼接符號不再是 + 加號運算子,而是 . 點運算子
4.2 字串內的 += 運算子號也不再表示拼接,而是使用 .= 來進行拼接
原本的 += 僅用來單純的數學運算累加。
- 例子:
$str1 = '123'; var_dump($str1+= '456');//int(579) $str1 = '123'; var_dump($str1.= '456');//string(6) "123456"
5. php 流程控制語句
php 中流程控制語句與 js 中的流程控制語句語法基本一樣,可以直接使用。
php 中不但包括了 js 中原有的語句,還新添加了一些流程控制:
5.1 快速遍歷不再是for-in結構,而是提供了一個foreach語句
- 描述:
foreach語法結構提供了遍歷陣列的簡單方式,foreach僅能夠應用於陣列和物件。
如果嘗試應用於其他資料類型的變數,或者未初始化的變數將發出錯誤資訊。 - 語法:
foreach (array_expression as $value) { statement } 或者 foreach (array_expression as $key => $value) { statement } - 注意:
a. 第一種格式遍歷給定的array_expression陣列。每次迴圈中,當前單元的值被賦給$value並且陣列內部的指標向前移一步
(因此下一次迴圈中將會得到下一個單元)。
b. 第二種格式做同樣的事,只除了當前單元的鍵名也會在每次迴圈中被賦給變數$key。 - 例子:
$arr = [1,2,3,4,5]; foreach ($arr as $index => $value) { echo '$arr[' . $index. ']:' . $value. "<br/>"; }
5.2 文件引入語句 include 和 require
文件的單次引入語句 include_once 和 require_once
- 描述:
include和require語句都表示包含並運行指定檔。
但未找到文件include會發出一條警告,後者會發出一個致命錯誤 - 語法:
include ‘檔案名稱|檔案路徑;’ - 注意:
a. 當一個檔案被包含時,其中所包含的代碼繼承了include所在行的變數範圍。
從該處開始,調用檔在該行處可用的任何變數在被調用的檔中也都可用。
b. 不過所有在包含檔中定義的函數和類別都具有全域作用域。 - 例子:
test.php
留言