PHP基礎之基本語法大全
PHP的常見語法
PHP程式碼執行方式:
-
在伺服器端執行,然後返回給使用者結果。如果直接使用瀏覽器開啟,就會解析為文字。
-
意思是說,需要瀏覽器通過 http請求,才能夠執行php頁面。
這裡只列舉常用的PHP語法,更為詳細的語法教程可以查閱 api 文件。
第一段 php 程式碼
將 WampServer 跑起來,在D:\wamp\www下新建一個1.php
檔案,程式碼如下:
1.php:
<?php
echo "hello smyhvae";
?>
在瀏覽器中輸入http://127.0.0.1/2018-02-28/1.php
,效果如下:
程式碼的編寫位置:
上方程式碼中,注意php語言的格式,第一行和第三行的格式中,沒有空格。程式碼的編寫位置在<?php 程式碼寫在這裡?>
註釋
php 註釋的寫法跟 js 一致。
<?php
//這是單行註釋
/*
這是多行註釋
*/
?>
變數
-
變數以
$
符號開頭,其後是變數的名稱。大小寫敏感。 -
變數名稱必須以字母或下劃線開頭。
舉例:
$a1;
$_abc;
資料型別
PHP支援的資料型別包括:
-
字串
-
整數
-
浮點數
-
布林
-
陣列
-
物件
-
NULLL
定義字串時需要注意:
-
單引號`` :內部的內容只是作為字串。
-
雙引號"" :如果內部是PHP的變數,那麼會將該變數的值解析。如果內部是html程式碼,也會解析成html。
說白了,單引號裡的內容,一定是字串。雙引號裡的內容,可能會進行解析。
echo "<input type=`button` value=`smyhvae`>";
上面這個語句,就被會解析成按鈕。
// 字串
$str = '123';
// 字串拼接
$str2 = '123'.'哈哈哈';
// 整數
$numA = 1; //正數
$numB = -2;//負數
// 浮點數
$x = 1.1;
// 布林
$a = true;
$b = false;
// 普通陣列:陣列中可以放 數字、字串、布林值等,不限制類型。
$arr1 = array('123', 123);
echo $arr1[0];
// 關係型陣列:類似於json格式
$arr2 = $array(`name`=>`smyhvae`, `age`=>`26`);
echo $arr2[`name`]; //獲取時,通過 key 來獲取
上方程式碼中注意,php 中字串拼接的方式是 .
。要注意哦。
運算子
PHP 中的運算子跟 JavaScript 中的基本一致,用法也基本一致。
-
算數運算子:
+
、-
、/
、*
、%
-
賦值運算子:
x = y
、x += y
,x -= y
等。
舉例:
<?php
$x = 10;
$y = 6;
echo ($x + $y); // 輸出 16
echo ($x - $y); // 輸出 4
echo ($x * $y); // 輸出 60
echo ($x / $y); // 輸出 1.6666666666667
echo ($x % $y); // 輸出 4
?>
函式的定義
語法格式:
function functionName() {
//這裡寫程式碼
}
(1)有引數、無返回值的函式:
function sayName($name){
echo $name.'你好哦';
}
// 呼叫
sayName('smyhvae');
(2)有引數、引數有預設值的函式:
function sayFood($food='西蘭花'){
echo $food.'好吃';
}
// 呼叫
sayFood('西葫蘆');// 如果傳入引數,就使用傳入的引數
sayFood();// 如果不傳入引數,直接使用預設值
(3)有引數、有返回值的函式:
function sum($a,$b){
return $a+$b
}
sum(1,2);// 返回值為1+2 = 3
類和物件
PHP中允許使用物件這種自定義的資料型別。必須先宣告,例項化之後才能夠使用。
定義最基礎的類:
class Fox{
public $name = 'itcast';
public $age = 10;
}
$fox = new $fox;
// 物件屬性取值
$name = $fox->name;
// 物件屬性賦值
$fox->name = '小狐狸';
帶建構函式的類:
class fox{
// 私有屬性,外部無法訪問
var $name = '小狐狸';
// 定義方法 用來獲取屬性
function Name(){
return $this->name;
}
// 建構函式,可以傳入引數
function fox($name){
$this->name = $name
}
}
// 定義了建構函式 需要使用建構函式初始化物件
$fox = new fox('小狐狸');
// 呼叫物件方法,獲取物件名
$foxName = $fox->Name();
內容輸出
-
echo
:輸出字串。 -
print_r()
:輸出複雜資料型別。比如陣列、物件。 -
var_dump()
:輸出詳細資訊。
$arr =array(1,2,'123');
echo'123';
//結果:123
print_r($arr);
//結果:Array ( [0] => 1 [1] => 2 [2] => 123 )
var_dump($arr);
/* 結果:
array
0 => int 1
1 => int 2
2 => string '123' (length=3)
*/
迴圈語句
這裡只列舉了foreach
、for
迴圈。
for 迴圈:
for ($x=0; $x<=10; $x++) {
echo "數字是:$x <br>";
}
foreach 迴圈:
$colors = array("red","green","blue","yellow");
foreach ($colors as $value) {
echo "$value <br>";
}
上方程式碼中,引數一:迴圈的物件。引數二:將物件的值挨個取出,直到最後。
如果迴圈的是物件,輸出的是物件的屬性的值。
輸出結果:
red
green
blue
yellow
php中的header()函式
瀏覽器訪問http伺服器,接收到響應時,會根據響應報文頭的內容進行一些具體的操作。在php中,我們可以根據 header 來設定這些內容。
header()函式的作用:用來向客戶端(瀏覽器)傳送報頭。直接寫在php程式碼的第一行就行。
下面列舉幾個常見的 header函式。
(1)設定編碼格式:
header('content-type:text/html; charset= utf-8');
例如:
<?php
header('content-type:text/html; charset= utf-8');
echo "我的第一段 PHP 指令碼";
?>
(2)設定頁面跳轉:
header('location:http://www.baidu.com');
設定頁面重新整理的間隔:
header('refresh:3; url=http://www.xiaomi.com');
php中的 get 請求和 post 請求
get 請求
可以通過$_GET
物件來獲取。
舉例:下面是一個簡單的表單程式碼,通過 get 請求將資料提交到01.php。
(1)index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 通過 get 請求,將表單提交到 php 頁面中 -->
<form action="01.php" method="get">
<label for="">姓名:
<input type="text" name="userName"></label>
<br/>
<label for="">郵箱:
<input type="text" name="userEmail"></label>
<br/>
<input type="submit" name="">
</form>
</body>
</html>
(2)01.php:
<?php
header('content-type:text/html; charset= utf-8');
echo "<h1>php 的get 請求演示</h1>";
echo '使用者名稱:'.$_GET['userName'];
echo '<br/>';
echo '郵箱:'.$_GET['userEmail'];
?>
上方程式碼可以看出,$_GET
是關係型陣列,可以通過 **$_GET[key
]**獲取值。這裡的 key 是 form 標籤中表單元素的 name 屬性的值。
效果:
post 請求
可以通過$_POST
物件來獲取。
舉例:下面是一個簡單的表單程式碼,通過 post 請求將資料提交到02.php。
(1)index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 通過 post 請求,將表單提交到 php 頁面中 -->
<form action="02.php" method="post" >
<label for="">姓名:
<input type="text" name= "userName"></label>
<br/>
<label for="">郵箱:
<input type="text" name= "userEmail"></label>
<br/>
<input type="submit" name="">
</form>
</body>
</html>
(2)02.php:
<?php
header('content-type:text/html; charset= utf-8');
echo "<h1>php 的 post 請求演示</h1>";
echo '使用者名稱:'.$_POST['userName'];
echo '<br/>';
echo '郵箱:'.$_POST['userEmail'];
?>
上方程式碼可以看出,$_POST
是關係型陣列,可以通過 **$_POST[key
]**獲取值。這裡的 key 是 form 標籤中表單元素的 name 屬性的值。
效果演示:
實際開發中,可能不會單獨寫一個php檔案,常見的做法是:在 html 檔案中嵌入 php 的程式碼。
比如說,原本 html 中有個 li 標籤是存放使用者名稱的:
<li>smyhvae</li>
嵌入 php後,使用者名稱就變成了動態獲取的:
<li><?php
echo $_POST[`userName`]
?></li>
php 中檔案相關的操作
檔案上傳 $_FILES
上傳檔案時,需要在html程式碼中進行如下設定:
(1)在html表單中,設定enctype="multipart/form-data"
。該值是必須的。
(2)只能用 post 方式獲取。
程式碼如下:
(1)index.html:
<form action="03-fileUpdate.php" method="post" enctype="multipart/form-data">
<label for="">照片:
<input type="file" name = "picture" multiple=""></label>
<br/>
<input type="submit" name="">
</form>
(2)在 php 檔案中列印 file 的具體內容:
<?php
sleep(5);// 讓伺服器休息一會
print_r($_FILES); //列印 file 的具體內容
?>
演示效果:
上方現象可以看出:
-
點選提交後,伺服器沒有立即出現反應,而是休息了一會
sleep(5)
。 -
在
wamp/tmp
目錄下面出現了一個.tmp
檔案。 -
.tmp檔案一會就被自動刪除了。
-
伺服器返回的內容中有檔案的名字
[name] => computer.png
,以及上傳檔案儲存的位置D:\wamp\tmp\php3D70.tmp
。伺服器返回的內容如下:
Array ( [upFile] => Array ( [name] => yangyang.jpg [type] => image/jpeg [tmp_name] => D:\wamp\tmp\phpCC56.tmp [error] => 0 [size] => 18145 ) )
檔案儲存
我們嘗試一下,把上面的例子中的臨時目錄
下面的檔案儲存起來。這裡需要用到 php 裡的 move_uploaded_file()
函式。#
格式如下:
move_uploaded_file($_FILES['photo']['tmp_name'], './images/test.jpg');
引數解釋:引數一:移動的檔案。引數二:目標路徑。
(1)index.html:(這部分的程式碼保持不變)
<form action="03.fileUpdate.php" method="post" enctype="multipart/form-data">
<label for="">照片:
<input type="file" name = "picture" multiple=""></label>
<br/>
<input type="submit" name="">
</form>
(2)PHP程式碼:
暫略。
WampServer 中修改上傳檔案的大小
(1)開啟 WampServer的檔案php.ini
:
(2)修改php.ini
中的如下內容:
設定檔案最大上傳限制:(值的大小可以根據需求修改)
file_uploads = On; 是否允許上傳檔案 On/Off 預設是On
upload_max_filesize = 32M; 設定 上傳檔案的最大限制
post_max_size = 32M; 設定 通過Post提交的最多資料
考慮網路傳輸快慢:這裡修改一些引數:
max_execution_time = 30000 ; 指令碼最長的執行時間 單位為秒
max_input_time = 600 ; 接收提交的資料的時間限制 單位為秒
memory_limit = 1024M ; 最大的記憶體消耗
HTTP 協議
請求
客戶端發出的請求,主要由三個組成部分:請求行、請求頭、請求主體。如下圖所示:
1、請求行:
-
請求方法:GET or POST
-
請求URL
-
HTTP協議版本
2、請求頭:
常見的請求頭如下:
User-Agent:瀏覽器的具體型別 如:User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
Accept:瀏覽器支援哪些資料型別 如:Accept: text/html,application/xhtml+xml,application/xml;q=0.9;
Accept-Charset:瀏覽器採用的是哪種編碼 如:Accept-Charset: ISO-8859-1
Accept-Encoding:瀏覽器支援解碼的資料壓縮格式 如:Accept-Encoding: gzip, deflate
Accept-Language:瀏覽器的語言環境 如:Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。Host:www.baidu.com
Connection:表示是否需要持久連線。
屬性值可以是Keep-Alive/close,HTTP1.1預設是持久連線,它可以利用持久連線的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。
要實現這一點,Servlet需要在應答中傳送一個Content-Length頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,然後在正式寫出內容之前計算它的大小。如:Connection: Keep-Alive
Content-Length:表示請求訊息正文的長度。對於POST請求來說Content-Length必須出現。
Content-Type:WEB伺服器告訴瀏覽器自己響應的物件的型別和字符集。例如:Content-Type: text/html; charset='gb2312'
Content-Encoding:WEB伺服器表明自己使用了什麼壓縮方法(gzip,deflate)壓縮響應中的物件。例如:Content-Encoding:gzip
Content-Language:WEB伺服器告訴瀏覽器自己響應的物件的語言。
Cookie:最常用的請求頭,瀏覽器每次都會將cookie傳送到伺服器上,允許伺服器在客戶端儲存少量資料。
Referer:包含一個URL,使用者從該URL代表的頁面出發訪問當前請求的頁面。伺服器能知道你是從哪個頁面過來的。Referer: http://www.baidu.com/
3、請求體:
指的是提交給伺服器的資料。
需要注意的是,如果是往伺服器提交資料,需要在請求頭中設定Content-Type: application/x-www-form-urlencoded
(在ajax中需要手動設定)。
響應
響應報文是伺服器返回給客戶端的。組成部分有響應行、響應頭、響應主體。
1、狀態行:
HTTP響應行:主要是設定響應狀態等資訊。
2、響應頭:
Cookie、快取等資訊就是在響應頭的屬性中設定的。
常見的響應頭如下:
Cache-Control
響應輸出到客戶端後,服務端通過該報文頭屬告訴客戶端如何控制響應內容的快取。
下面,的設定讓客戶端對響應內容快取3600秒,也即在3600秒內,如果客戶再次訪問該資源,直接從客戶端的快取中返回內容給客戶,不要再從服務端獲取(當然,這個功能是靠客戶端實現的,服務端只是通過這個屬性提示客戶端“應該這麼做”,做不做,還是決定於客戶端,如果是自己宣稱支援HTTP的客戶端,則就應該這樣實現)。
Cache-Control: max-age=3600
ETag
一個代表響應服務端資源(如頁面)版本的報文頭屬性,如果某個服務端資源發生變化了,這個ETag就會相應發生變化。它是Cache-Control的有益補充,可以讓客戶端“更智慧”地處理什麼時候要從服務端取資源,什麼時候可以直接從快取中返回響應。
ETag: "737060cd8c284d8af7ad3082f209582d"
Location
我們在Asp.net中讓頁面Redirect到一個某個A頁面中,其實是讓客戶端再發一個請求到A頁面,這個需要Redirect到的A頁面的URL,其實就是通過響應報文頭的Location屬性告知客戶端的,如下的報文頭屬性,將使客戶端redirect到iteye的首頁中:
Location: http://www.google.com.hk
Set-Cookie
服務端可以設定客戶端的Cookie,其原理就是通過這個響應報文頭屬性實現的。
Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
3、HTTP響應體:
如果請求的是HTML頁面,那麼返回的就是HTML程式碼。如果是JS就是JS程式碼。
抓包工具
常見的抓包工具有:Fiddler、Charles。