1. 程式人生 > >PHP基礎之基本語法大全

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 = yx += 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)
	*/

迴圈語句

這裡只列舉了foreachfor迴圈。

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。