1. 程式人生 > 實用技巧 >PHP基礎01

PHP基礎01

PHP

執行在伺服器端的指令碼語言,可嵌入HTML

動態網站開發的指令碼語言,動態語言特點是互動性,會有資料的傳遞,php作為中介來傳遞資料。傳遞的前提是php能自己儲存資料( 臨時儲存 )

處理指令碼讓瀏覽器按照指定字符集解析的方法:

<?php
header('Content-type:text/html;charset=utf-8');

程式碼標記

ASP標記:<%php程式碼%>

短標記:

(上面的基本棄用,使用需要在配置檔案開啟)

指令碼標記:<script language= "php”>php程式碼

標準標記:

<html>
<body>
    <b>
        //標準標記
        echo 'hello word';
</body>    
</html>

PHP程式碼執行流程

  1. 讀取程式碼檔案(PHP程式)
  2. 編譯:將PHP程式碼轉換成位元組碼(生成opcode)
  3. zendengine來解析opcode,按照位元組碼去進行邏輯運算
  4. 轉換成對應的HTML程式碼

註釋

​ 寫的時候加註釋(思路說明

​ 分為兩種:(和C差不多)

1.行註釋// or #

2.塊註釋 /* */

語句分隔符

​ php中,程式碼以行為單位,系統通過判斷行的結束,結束用;\(_英\)

注意:

​ 1.php中標記結束符?>有自帶語句結束符的效果,最後一行PHP程式碼可以沒有;

​ 2.php中很多程式碼的書寫不是嵌入到html中,而是單獨存在,通常書寫習慣中不建議用 ?>

,PHP會自動從開始到最後全部認為是php程式碼,從而解析。 (就是只寫< ? php程式碼

記憶體分割槽:

​ 1.棧區:程式可以操作的記憶體部分(不存資料,執行程式碼),少但是快。
​ 2.程式碼段:儲存程式的記憶體部分
​ 3.資料段:儲存普通資料(全域性區和靜態區)
​ 4.堆區:儲存複雜資料,大但是效率低

變數與常量

變數

​ 存資料、有名字、通過變數名訪問資料、變數中的資料可變

定義都得用$

定義:

​ 必須用$開始
​ 命名規則同C、C++、python等語言(字母數字下劃線
​ 允許中文變數(儘量別用

預定義變數:

​ 提前定義的變數,系統定義的,儲存許多需要用到的資料(預定義變數都是陣列

常用:

		$_GET      //獲取所有表單以get方式提交的資料
		$_POST     //POST提交的資料都儲存在這裡
		$_REQUEST  //GET和POST提交的都會儲存
		$_SERVER   //伺服器資訊
		$_SESSION  //session會話資料
		$_COOKIE   //cookie會話資料

不太常用:

		$GLOBALS:  //PHP中所有的全域性變數
		$_ENV:  //環境資訊
		$_FILES:  //使用者上傳的檔案資訊
可變變數:

​ 如果一個變數儲存的值剛好是另一個變數的名字,那麼可以直接通過訪問一個變數得到另一個變數的值:在變數前面多加一個$

	$a = 'b';
	$b = 'bb';
	echo $$a;//輸出為bb	(可理解成變數套變數
變數傳值:

​ 將一個變數賦值給另一個變數

兩種方式:

  1. 值傳遞:將變數儲存的值賦值一份,然後將新的值給另一個變數儲存。(變數無關)
		$a = 10;
		$b = $a;
		$b = $5;
		echo $a,$b,'<br/>';
		//輸出為105  (沒加空格
  1. 引用傳遞:將變數儲存的值所在的記憶體地址,傳遞給另一個變數。用同一個記憶體。(感覺類似淺拷貝,學過python的同學應該可以理解
		$c = 10;
		$d = &$c;
		$c = 5;
		echo $c,$d,'<br/>';
		//輸出為55   (沒加空格
<?php		
	$name;
//賦值
	$age = 17;//同時定義並賦值
//訪問
	echo $age;
//修改
	$age = 18;//修改
	echo '<hr/>',$age;//輸出換行符和$age
//刪除 用 unset()
	unset($age);
	echo $age; //會報undefined

常量

​ const/constant,一種在程式執行中不可改變的量(資料),是使用者級別的。

​ 同變數,用來儲存資料。

定義:

寫法:
​ 1.用定義常量的函式: define('常量名',常量值)
define('PI',3.1415926);
​ 2.const 常量名 = 常量值 (5.3以後可用,目前版本都可用
const PI = 3.1415926;
注意:
​ 1.define和const定義的常量有區別:訪問許可權方面有區別
​ 2.定義常量通常不區分大小寫,但可以區分。(參照define函式的第三個引數
規則:
​ 1.不能用 $ (用的話會被認為是變數。
​ 2.經常用大寫字母
​ 3.命名規則同C、C++、python等語言(字母數字下劃線
​ 4.常量命名規則比變數鬆散,可用一些特殊字元(這時候只能用define
define('-_-',5);

系統常量:

​ 系統幫助使用者定義的常量,使用者可直接使用。

常用的幾個:

<?php	
	PHP_VERSION  //PHP版本號
	PHP_INT_SIZE  //整型大小(幾個位元組
	PHP_INT_MAX  //整型能表示的最大的值(PHP中整型允許出現負數,帶符號)

系統魔術常量:雙下劃線+常量名+雙下劃線 (魔術常量的值通常會跟環境變化,使用者不可操作

	__DIR__        //當前被執行指令碼所在電腦的絕對路徑
	__FILE__       //當前被執行指令碼所在電腦的絕對路徑(帶自己的檔名字)
	__LINE__       //當前所屬行數  (在php中第幾行
		
	__NAMESPACE__  //當前所屬名稱空間
	__CLASS__	   //當前所屬的類
	__METHOD__     //當前所屬的方法

使用形式:注意定義的時候一定記得賦值

  1. echo 常量名;
  2. 當想輸出特殊名字的時候,需要用另一種形式: constant('常量名')
    注意:常量和變數的使用,(看資料會不會變化,來決定使用哪個
<?php
	define('PI',31415926);
	echo PI;
	define('-_-',5);
	echo constant('-_-');
與變數有關的函式:
  • isset(變數);。判斷變數是否存在, 如果值為 NULL 也等價於不存在
  • unset(變數);。釋放變數所佔資源
  • setType(變數, 型別);。改變變數資料型別
  • getType(變數);。獲取變數資料型別
  • empty(變數);。判斷變數是否為空
  • var_dump();。輸出變數的型別和值
  • is_型別(變數);。判斷變數是否為某個型別, 如:

is_int()
is_array()
is_resource()
is_scalar()——是否為標量
is_numeric()——是否為數字或數字字串
is_callable()——判斷是否為有效函式名

變數(常量)的作用域

​ 作用域:變數(常量)能夠被訪問的區域。

  1. 變數可以在普通程式碼中定義
  2. 變數也可以在函式內部定義

在PHP中作用域有三種:

  1. 全域性變數:就是使用者普通定義的變數(函式外部定義)

    所屬全域性空間:在PHP中只允許在全域性空間使用,理論上函式內部不可用

    腳本週期:直到指令碼執行結束才會消失

  2. 區域性變數:在函式內部定義的變數

    所屬當前函式空間:在PHP中只允許在當前函式自己內部中使用

    函數週期:函式執行結束(函式是在棧區中開闢獨立記憶體空間執行

  3. 超全域性變數:系統定義的變數(預定義變數:$_SERVER、$_POST等

    所屬超全域性空間:沒有訪問限制(函式內外都可訪問)

超全域性變數會將全域性變數自動納入到$GLOBALS裡面,而$GLOBALs沒有作用域限制,所以能幫助區域性取訪問全域性變數,但必須用陣列方式

<?php
	$ a = 10; //最終會被系統納入到超全域性變數中:$GLOBALS['a']
	function show(){ 
        echo $GLOBALS['a'];
    }

如果函式內部想呼叫外部變數:除了$GLOBALS 之外,通過引數傳值(如果要引用戰線,還可以使用引用傳值。

在PHP中還有一種方式,能實現全域性訪問區域性,同時區域性也可以訪問全域性:global關鍵字

global關鍵字: 一種在函式裡面定義變數的一種方式

  1. 如果使用global定義的變數名在外部存在(全域性變數),那麼系統直接指向外部全域性變數所指向的記憶體空間(同一變數,不同名字)
  2. 如果使用global定義的變數名在外部不存在(全域性變數),系統會自動在全域性空間(外部)定義一個與區域性變數同名的全域性變數。

本質的形式:在函式的內部和外部,對一個同名變數(全域性和區域性)使用同一塊記憶體地址儲存資料,從而實現共同擁有。

<?php
	$a = 10;
	function show(){
        //在函式中呼叫全域性變數
		global $a;
		echo $a;
        
        //定義一個區域性變數,全域性變數中不存在;
        global $b;
        $b = 'b';
    }
	echo $b;//可以呼叫。

雖然可以實現全域性與區域性的互訪,但是通常不這麼用。一般如果和存在特殊使用,也會使用引數的形式來訪問。(還可用常量,用define定義)

靜態變數

​ static,在函式內部定義的量,使用static關鍵字修飾,用來實現跨函式共享資料的變數:函式執行結束所有區域性變數都會清空,如果重新執行一下函式,所有的區域性變數又會重新初始化。

<?php
	funticon show(){
        //定義變數
        $ a = 1;
        //定義靜態變數,最好定義的時候就賦值
        static $b = 1;
        
        echo $a++,' ',$b++,<'br'>;
    }
	show();//1 1
	show();//1 2
	show();//1 3
//這樣應該不難理解靜態變量了。
作用:

​ 為了跨函式共享資料(注意是:同一個函式多次使用。

原理:

​ 系統在進行編譯的時候就會對static進行初始化:給其賦值。

函式在呼叫的時候會自動跳過static關鍵字這一行

使用:
  1. 為了統計當前函式被呼叫次數(顯然也可以超全域性變數來統計
  2. 統籌函式多次呼叫得到的不同結果。(遞迴思想)

資料型別

​ 指儲存的資料本身的型別,不是變數的型別。

​ PHP是一種弱型別語言,變數本身沒有資料型別

八種資料型別

​ php中的資料分為三大類八小類

一、簡單資料型別
  • 整型:int/integer,佔4個位元組,表示整數型別。

  • 浮點型:float/double,佔8個位元組,表示小數或整型存不下的數

  • 字串型:string,系統根據實際長度分配記憶體,表示字串(加引號)

  • 布林型別:bool/boolean,表示布林型別,只有true 和 false

二、複合資料型別
  • 物件型別:object,存放物件(面向物件)

  • 陣列型別:array,儲存多個數據(一次性)

三、特殊資料結構型別
  • 資源型別:resource,存放資源資料(PHP外部資料,eg:資料庫、檔案)

  • 空型別:NULL,只有一個值,為NULL(不能運算)

資料型別轉換

​ 在很多條件下,需要指定的資料型別,需要外部資料(PHP目前獲得的資料),轉換成目標資料型別。

兩種轉換方式
  1. 自動轉換:系統根據需求自己判定,自己轉換(用得多,效率低

  2. 強制(手動)轉換:人為根據需要的目標型別轉換。

    強制轉換的規則:在變數前加() 在裡面寫對應的型別(你想轉的),想轉NULL型別需要用unset();

注:1.在轉換中,用的比較多的是轉布林型別(判斷)和轉數值型別(算術運算)

2.其它型別轉bool型別:(詳見下面bool型別的表格)

說明:

  1. true 是 1 ,false 是 0

    2.字串型別轉數值的規則

    2.1:以字母開頭的字串,永遠為0

    2.2:以數字為開頭的字串,取到碰到非數字字元開始(不會同時包含兩個小數點)

資料型別判斷

​ 通過一組型別判斷函式判斷變數,最終返回這個變數所儲存資料的資料型別

​ 寫法: is_+型別名(變數名) \(eg:is\_int(a)、is\_bool(b)\)

如果是就返回true,不是就返回false; (為bool型別

​ bool型別不能用echo檢視,可用var_dump結構檢視 \(eg:var\_dump(變數1,變數2...)\)

<?php
	$a = 'abc123456';
	var_dump(is_int($a));//bool(false)
	var_dump(is_string($a));//bool(true)

還有一組函式可以用來獲取並設定資料(變數)的型別

​ gettype(變數名):獲取型別,得到該型別對應的字串

​ settype(變數名,'型別'):設定資料型別,不同於強制轉換。

<?php
	gettype($a);///string
	var_dump(setttype($b,'int'));//bool(true)
	/*true表示成功,false表示失敗*/
	echo gettype($b); // integer

​ 1. 強制轉換(型別)變數名,是對資料值複製的內容進行處理(不處理實際儲存的內容) (可理解為只是當前語句中改變一下

​ 2.settype會直接改變資料本身 (改變之後就全變了

整數型別進位制簡介

​ 用來儲存整數數值(範圍限制),佔4個位元組,有正負;

<?php
	$a = 0b110;//二進位制前面加0b
	$a = 0110;//八進位制前面加0
	$a = 110;//十進位制前面什麼都不加
	$a = 0x110;//十六進位制前面加0x
	//注 :php的輸出,數值預設轉換成10進位制來輸出
	//用PHP_INT_MAX來求int的最大值--->2147483647
/*
進位制轉換:
	手動十進位制轉二進位制的方法:(這裡提一下
			1.除二取餘,整數部分倒排,小數部分正排。(不管是什麼數,要補滿32位
			2.取2的次冪,每次取不大於這個數的最大的2的次冪。
		其它的轉換,相信大家都學過,不過多的解釋。十進位制轉R進位制都是每次除R取餘。
	用函式:
		十進位制轉其它進位制:
			decbin(x) //把十進位制的x轉換成二進位制數,string型別
			
			decoct(x) //把十進位制的x轉換成八進位制數,string型別
			
			dechex(x) //把十進位制的x裝換成十六進位制數,string型別
		二進位制轉其它進位制:
        	bin2hex(x) //二進位制轉換成十六進位制 ,string型別
        	
        	bindec(x)//二進位制轉十進位制,數值比int範圍大的時候,返回float型別
        八進位制轉其它進位制:
        	octdec(x)//八進位制轉十進位制,數值比int範圍大的時候,返回float型別
        十六進位制轉十進位制:
        	hexdec(x)//十六進位制轉十進位制,數值比int範圍大的時候,返回float型別。hexdec() 將遇到的所有非十六進位制字元替換成 0。這樣,所有左邊的零都被忽略,但右邊的零會計入值中。
        任意進位制轉換:
        	base_convert(x,a,b);//把a進位制下的x轉換成b進位制,(a,b都在2-36之間)x中的數字比10大的數字用a-z表示。z 表示 35.  返回為string型別。
*/
一、整數型別

​ 略

二、浮點型別

​ 小數型別,以及儲存超整型範圍的整數(但是不保證精度,精度範圍在15個有效數字左右。

<?php
	$f1 = 1.23;
	$f2 = 1.2345e4;   //e後面只能接整數
	var_dump($f1,$f2); // float(1.23) float(12345)
	//當整型超過自身的儲存大小之後用浮點型儲存
/*
	為啥浮點數能表示更大的資料?
		00000000 00000000 00000000 00000000 --> 11111111 11111111 11111111 11111111 (整型的最大值,所有位都是有效資料
		00000000 00000000 00000000 00000000 --> 1'1111111' 11111111 11111111 11111111 (浮點數的前7位算的結果是10的指數(10^128),後面三個位元組儲存表示具體數值。
	
*/

儘量別用浮點數做精確判斷,計算機中小數儲存一般都不準。

三、布林型別

​ 只有兩個值,true和false,通常用來判斷比較。

<?php
	$b1 = true;
	$b2 = FALSE;
	var_dump($b1,$b2);
	// bool(true)bool(false)

在進行資料判斷的時候,需要特別注意型別轉換:

​ empty() : 判斷是否為空,同C/C++中常用的函式

​ lsset() : 判斷資料儲存的變數本身是否存在,存在返回true,不存在返回false;

四、字串型別

偽型別

(我也不知道放在這裡是否合適,暫且放這裡了

​ 假型別,實際上在php中不存在的型別,但是通過偽型別可以幫助程式設計師更好的檢視操作手冊,從而更方便學習。

主要有兩種

  • mixed:可以是多中php中的資料型別
  • number:數值的,可以是任意數值型別(整型和浮點型

mixed-->只要是php中的型別即可

運算子(operator)

​ 將資料進行運算的特殊符號,在php中一共有十種。(在C語言中一些沒有學過的運算子前面用*標出了

一、賦值運算子

​ ‘=’ :右邊的賦值給左邊。(可以是變數、資料、常量、其他運算出來的結果)將右邊的結果儲存到記憶體的某個位置,再將位置的記憶體地址賦值給左側的變數(常量)。

(和你之前學的一樣。

二、算術運算子

​ +、-、*、/、% 與所學語言的含義相同,不作過多解釋。

/後面不能是0,%後面不能是0

*三、比較運算子

​ >、>=、<、<=、== 、!= 與之前所學語言一樣,不過多解釋。

注意:這些只比較值的大小,eg:'123' == 123為true

  • ===:全等於,左邊與右邊相同的條件:大小以及資料的型別都要相同

  • !==:不全等於,大小或者型別不同即可

四、邏輯運算子

​ 針對不同結果進行匹配;

​ &&、||、! 相信學過的同學都會,不過多闡述。

別忘了 &&和||還叫短路運算:第一個表示式結果滿足條件的話,那麼就不會執行運算子後面的表示式了。

寫程式碼的時候,儘量將出現頻率最高(能直接判斷出結果的)的表示式放在第一位

*五、連線運算子

​ 將多個字串拼接的符號

  • . : 將兩個字串連線到一起
  • .= :複合運算。$a .=$b等價於$a =$a .$b (這裡為全形實現為半形

*六、錯誤抑制符

  PHP中一些錯誤可以提前預知,但是這些錯誤可能無法避免,但是又不希望報錯給使用者看,可用錯誤抑制符處理
  • @:在可能出錯的表示式前加@符號即可
<?php
	$a =10;
	$b = 0;
	@($a % $b);//不會報錯
	$a % $b;//會報錯
//引用:	錯誤抑制符通常在生產環境(上線)會用到,在開發的時候不會用:系統本身最好沒有任何錯誤。

七、三目運算子

​ 三個表示式參與運算,是簡單的分支結構縮寫;(可複合使用

  • 表示式1 ? 表示式2: 表示式3;

在這裡解釋一下:

  1. 如果表示式的值為true,得到表示式2;
  2. 如果表示式的值為false,得到表示式3;

八、自操作運算子

​ 自己操作自己(。

  • $a++; 等價於$a =$a + 1;
  • $a--; 等價於$a =$a - 1;

注:++、--可在$a的前後,決定著運算順序。(在前先執行,在後後執行

九、複合運算子

​ +=、-=、*=、/=、%= 舉例:$a += $b 等價於 $a = $a + $b ,其它的同理。

注:/和%的時候,考慮右邊表示式的結果是否為0

十、位運算子

計算機碼

​ 計算機在實際儲存資料的時候,採取的編碼規則(二進位制規則)。包括原碼、反碼和補碼。數值本身最左邊一位是用來充當符號位的:正數為0,負數為1

  • 原碼:資料本身從十進位制轉換成二進位制得到的結果。

  • 反碼:針對負數,符號位不變,其他位取反。(正數的反碼還是他本身

  • 補碼:針對負數,反碼加1。

系統中有兩個 0 : +0與-0:

+0:00000000 -0:10000000 儲存形式都是補碼的00000000

位運算子

​ 取出計算機中最小的單位(位bit)進行運算。(這裡用的是全形,真正實現起來是半形

  • & 按位與:兩個都是1才會是1
  • | 按位或:只要有一個是1就是1
  • ~ 按位非:就是取反.~1-->0 , ~0-->1
  • ^ 按位異或:相同為0,不同為1
  • << 按位左移 1 << i <--->2 ^ i
  • >> 按位右移 1 >> i <--->1/2^i

進行位運算時候用的都是補碼.運算之後必須轉換成原碼才是最終要的結果.

右移位運算不足的時候,補的是符號位.

十一、運算子的優先順序

​ 用多了就能比較熟悉了,(運算子多的時候加括號就沒問題

詳見php手冊

結構

​ 程式碼執行的方向

結構分類
  • 順序結構:從上往下,順序執行。(程式碼執行最基本結構
  • 分支結構:給定一個條件,同時有多種可執行程式碼塊,由條件判定執行某一程式碼
  • 迴圈結構:滿足條件的前提下,重複執行這一程式碼塊
1.順序結構

​ 最基本的結構,所有程式碼預設從上往下順序執行。

2.分支結構

​ 分為if分支switch分支

2.1 if分支

​ 相信學過其它語言的同學都能理解意思。這裡只放出寫法

<?php
//基礎結構
    if(條件表示式){
        語句1;
    }
	else{
        語句2;
    }

//複合結構
	if(條件表示式1){
        語句1;
    }
	else if(條件表示式2){  //也可寫成elseif
        語句2;
    }
	else{
        語句3;
    }

2.2 switch分支

​ 同樣只放出寫法。

<?php
    switch(條件表示式){
        case 值1: 
            語句1;
            break;
        case 值2:
            語句2;
            break;
        default:
            break;
    }
3.迴圈結構

​ 分為for迴圈、while迴圈、do-while迴圈、foreach迴圈(專門針對陣列

這裡不給出對於哪種問題用哪個迴圈,相信在學習過程中,有自己的一個寫法。

3.1 for迴圈

<?php
    for(表示式1;表示式2;表示式3){
        語句;
    }
	/*
	表示式1是賦值語句(賦初值。可以用逗號隔開定義多個變數
	表示式2是判斷語句(判斷邊界
	表示式3是條件變化語句
	*/

3.2 while迴圈

<?php
    while(條件表示式){
        語句;
    }
	//條件表示式即為判斷語句,判斷邊界用。

3.3 do-while迴圈

<?php
    do{
        語句;
    }while(條件表示式);
	//條件表示式為判斷語句,判斷邊界用。

3.4 迴圈控制

​ 在迴圈內部對迴圈本身進行控制。

  • 中斷控制:重新開始迴圈,迴圈體中還有其他內容,也再執行。 \(continue\)(跳過當前層的一次迴圈

  • 終止控制:直接結束迴圈。\(break\)(直接跳出當前層的迴圈

使用情況自行決定。

注意:php中有 continue x、break x; (理解起來就是對於x層迴圈的操作

4.流程控制替代語法

​ 分支結構和迴圈結構的替代語法

  ​	php本身是嵌入到HTML的指令碼語言,需要在HTML中寫一些用於判斷或迴圈的結構語法,必須符合php標籤規範,需要HTML與PHP進行混搭,如果使用原始的php程式碼就非常不美觀
//列印九九乘法表
<table border=1>
    <?php for($i = 1 ;$i <= 9;$i++){?>
    	<tr>
            <?php for($j = 1;$j <= $i;$j++){?>
            	<td>
                    <?php echo $i. '*' . $j . '=' .$i * $j;?>
            	</td>
            <?php }?>
    	</tr>
    <?php }?>
</table>
/*
<table>是表格
<tr>是表格裡的行
<td>是行裡的單元格
*/

這是輸出結果

  但是這種寫法很容易忘記{},還不美觀,所以php提供了一種替代機制,讓其可以不寫大括號

for( ; ; ){ --> for( ; ; ): //注意這裡有個冒號

} --> endfor;

那麼就有另一種寫法:

//列印九九乘法表
<table border=1>
    <?php for($i = 1 ;$i <= 9;$i++):?>
    	<tr>
            <?php for($j = 1;$j <= $i;$j++):?>
            	<td>
                    <?php echo $i. '*' . $j . '=' .$i * $j;?>
            	</td>
            <?php endfor;?>
    	</tr>
    <?php endfor;?>
</table>

4.1 php中具體有哪些替代語法?

​ php應該在HTML中只做資料輸出,輸出通產伴有條件判斷和迴圈操作,因此php提供了對應分支結構和迴圈結構的替代語法:全部對應一個模式。

  • { --> :(左大括號用冒號來替換
  • } --> end+對應起始標記
if():      endif;
switch():  endswitch;
for(;;);   endfor;
while():   endwhile;

函式

函式的基本概念

function,一種語法結構,用來封裝程式碼塊,實現複用。

函式定義語法

​ 重要成分:function關鍵字、函式名、形參與實參、函式體和返回值。

<?php
	/*定義函式*/
	function 函式名([引數]){
        //函式體
        //返回值: return 結果(可以沒有
    }
	
	/*呼叫函式*/
	函式名([引數]);  //定義時候有引數一定記得傳參

函式是在程式碼執行階段,碰到函式名字的時候才會呼叫,不是在編譯階段。

呼叫特點: 只要系統能在記憶體中找到對應的函式,就可以執行。(呼叫可在函式定義之前。

函式執行的記憶體分析

  1. 讀取程式碼進入到程式碼段(編譯:將程式碼編譯位元組碼儲存到記憶體
  2. 根據程式碼逐行執行

那麼無論在什麼位置都能呼叫函式就是因為:編譯和執行是分開的

函式命名規範

​ 與變數的命名規則相同。不可以數字開頭。

建議命名的時候用名字代表函式功能

注:在一個腳本週期中,不允許出現同名函式。(通常在一個系統開發中,不會使用同名函式。

對引數的解釋

一、形參

​ 形式引數,不具有實際意義的引數,在函式定義時使用的引數。(形參可以有多個,用逗號分隔。

二、實參

​ 實際引數,具有實際意義的引數,在函式呼叫時使用的引數。

(傳入的實參,可以是變數或者其它有值的表示式:變數、常量、運算子計算結果。

形參是實參的載體。在實際呼叫的時候,資料以實參的形式傳遞給形參,給形參賦值以達到呼叫的效果。

<?php
	function add($x,$y){echo $x + $y;}
	$a = 1;
	add($a,2); 

注:

  1. PHP中允許實參 >= 形參(個數),多餘的,函式內部不用而已。(不可以比形參少

  2. PHP中理論上形參個數沒有限制

三、預設值

​ default value,指的是形參的預設值,在函式定義的時候,就給形參進行一個初始賦值;如果呼叫時候實參沒有給形參賦值,形參就會用定義的值參與運算。

通常用在,一定會有某個資料參與,但是可能通常是某個我們知道的值。

預設值存在的時候,可以不用傳入。

<?php
	function minus($x = 0,$y = 0){echo $x + $y;}

注:

  1. 預設值的定義需要放在最後面(可以有多個),不能前面有而後面沒有。
  2. 每個獨立的函式中,函式名與形參名不衝突;在不同函式中也可以有相同的形參名
四、引用傳遞

​ 實參在呼叫的時候,會將值賦給形參,但是本身沒關係。如果有時候想讓實參的值變換,需要引用傳值。(在形參名字前加地址符&,並且傳入的實參必須是變數

<?php
	function 函式名(&形參名){
        //函式體;
    }
	函式名(引數)
//呼叫的時候,這個參必須是變數!
五、函式體

​ 函式體:大括號裡面的所有程式碼。(基本你要用到的都能幹。

六、函式返回值

​ return,通過return關鍵字將函式的結果,返回給外部。(沒有return時,系統預設返回NULL。

<?php
	function add($x,$y){return $x + $y;}
	//與上面不同的是這裡用的是return。

	$a = add(1,2);
	//可以定義變數來接收這個值

注:

  1. 函式返回值可以是任意資料型別。
  2. return不僅可以返回結果,也標誌著被呼叫函式結束執行。
  3. return還可以在檔案中直接使用(不在函式裡面),這樣做代表檔案將return 後面的內容,轉交給當前檔案的位置(通常在系統配置檔案中使用)。在return之後的程式碼不會執行

第三點可以簡單理解成檔案巢狀包含中的呼叫。

常用的系統函式

一、有關輸出的函式
  • print(); 類似於echo輸出提供的內容,本質上是一種結構,(不是函式,且可不用函式
  • print_r(); 類似於var_dump,但是比var_dump簡單,不會輸出資料型別,只會輸出值(常用在陣列列印
<?php
    echo print('hello<br/>');
	print 'hello<br/>';

	$a = 'hello<br/>';
	print_r($a);
/*
hello
1hello   //這裡這個1是輸出的是呼叫print函式時候的返回值
hello
*/

注意:print_r(mixed x,[bool y])裡面可以傳入兩個引數,這裡不解釋x,其中y可有可無:當y為true時,print_r()不輸出結果,而是賦值給一個變數;y為false時,直接輸出結果。預設為false。

二、有關時間的函式

詳細的看這裡

  • date():按照指定格式對對應的時間戳(從1970年格林威治時間開始計算的秒數),如果沒有給定引數,那就是當前的時間戳等價於time() 詳見此處 (不建議去背,用多了會熟。
  • time():獲取當前時間對應的時間戳 詳見此處
  • microtime():獲取微秒級別的時間 詳見此處
  • strtotime():按照規定格式的字串轉換成時間戳 詳見此處
三、有關數學的函式

詳見此處

  • max():指定引數中最大的值

  • min():指定引數中最小的值

  • rand(a,b):得到[a,b]中的一個隨機整數

  • mt_rand():與rand()一樣,只是底層結構不一樣,效率比rand高

  • round():四捨五入

  • ceil():向上取整

  • floor():向下取整

  • pow(a,x):計算a^x

  • abs():求絕對值

  • sqrt():開根號

四、有關函式的函式
  • function_exists():判斷指定的函式名字是否在記憶體中存在(幫助使用者不去使用一個不存在的函式,讓程式碼安全性更高
  • func_get_arg():在自定義函式中去獲取指定數值對應的引數
  • func_get_args():在自定義函式中獲取所有的引數(陣列)
  • func_num_args():獲取當前自定義函式的引數數量
<?php
	function test($a,$b){
        //獲取指定引數
        var_dump(func_get_arg(1));//返回索引為1的,注意還是從0開始,這裡返回$b
        
        //獲取所有引數
        var_dump(func_get_args());
        
        //獲取引數數量
        var_dump(func_num_args());
    }
	
	function_exists('test') && test(1,'2',3,4);
/*
string(1)"2"
array(4) {
	[0]=>
	int(1)
	[1]=>
	string(1)"2"
	[2]=>
	int(3)
	[3]=>
	int(4)
}
int(4)
*/

func_get_args和func_num_args都是統計的對應實參的數量。

可變函式

​ 當前有一個變數所儲存的值,剛好是一個函式的名字,那麼就可以使用變數+()來充當函式名使用。

<?php
    $ nam = 'show';
	function show(){
    	//函式體    
    }
	//可變函式
	$nam();//可以呼叫show函式,並執行函式體。

​ 可變函式在系統使用過程中比較多,尤其是使用很多系統函式的時候,需要使用者在外部定義一個自定義函式,但是是需要傳入到系統函式內部使用。

匿名函式

​ 沒有名字的函式。

<?php
	變數名 = function(){
        //函式體
    };//注意這裡要有個分號
	$變數名();//調
有何意義?

​ 變數儲存匿名函式,本質得到的是一個物件(closure);

閉包(closure)

​ “閉包” 一詞來源於以下兩者的結合:要執行的程式碼塊(由於自由變數被包含在程式碼塊中,這些自由變數以及它們引用的物件沒有被釋放)和為自由變數提供繫結的計算環境(作用域)。 ----來自度娘

簡單理解:

函式內部有一些區域性變數(要執行的程式碼塊)在函式執行後沒有被釋放,是因為在函式內部還有對應的函式在引用。

閉包可以理解成:“定義在一個函式內部的函式“。在本質上,閉包是將函式內部和函式外部連線起來的橋樑。

<?php
    function show(){
    	$name = __FUNCTION__;
    
    	$innerfunction = function() use($name){//use就是將外部變數(區域性)保留給內部使用(閉包)
			echo $name;
        }
    	$innerfunction();//呼叫內部函式
	}

/*
如何證明函式的區域性變數在函式使用完之後沒有被釋放?

1. 使用內部匿名函式
2. 匿名函式使用區域性變數:use
3. 匿名函式被返回給外部使用。
*/

	function shows(){
    	$nam = __FUNCTION__;
    
    	$innerfunction = function() use($nam){//use就是將外部變數(區域性)保留給內部使用(閉包)
			echo $nam;
        }
    	return $innerfunction();//呼叫內部函式
	}
	$now = shows();
	// 到當前位置,shows函式執行結束,理論上區域性變數$nam已經被釋放。
	echo $nam;//仍舊輸出shows,$name並沒有被釋放。