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程式碼執行流程
- 讀取程式碼檔案(PHP程式)
- 編譯:將PHP程式碼轉換成位元組碼(生成opcode)
- zendengine來解析opcode,按照位元組碼去進行邏輯運算
- 轉換成對應的HTML程式碼
註釋
寫的時候加註釋(思路說明
分為兩種:(和C差不多)
1.行註釋 用 //
or #
2.塊註釋 /* */
語句分隔符
php中,程式碼以行為單位,系統通過判斷行的結束,結束用;
\(_英\)
注意:
1.php中標記結束符?>
有自帶語句結束符的效果,最後一行PHP程式碼可以沒有;
2.php中很多程式碼的書寫不是嵌入到html中,而是單獨存在,通常書寫習慣中不建議用 ?>
記憶體分割槽:
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 (可理解成變數套變數
變數傳值:
將一個變數賦值給另一個變數
兩種方式:
- 值傳遞:將變數儲存的值賦值一份,然後將新的值給另一個變數儲存。(變數無關)
$a = 10;
$b = $a;
$b = $5;
echo $a,$b,'<br/>';
//輸出為105 (沒加空格
- 引用傳遞:將變數儲存的值所在的記憶體地址,傳遞給另一個變數。用同一個記憶體。(感覺類似淺拷貝,學過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__ //當前所屬的方法
使用形式:注意定義的時候一定記得賦值
- echo 常量名;
- 當想輸出特殊名字的時候,需要用另一種形式: 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()——判斷是否為有效函式名
變數(常量)的作用域
作用域:變數(常量)能夠被訪問的區域。
- 變數可以在普通程式碼中定義
- 變數也可以在函式內部定義
在PHP中作用域有三種:
全域性變數:就是使用者普通定義的變數(函式外部定義)
所屬全域性空間:在PHP中只允許在全域性空間使用,理論上函式內部不可用
腳本週期:直到指令碼執行結束才會消失
區域性變數:在函式內部定義的變數
所屬當前函式空間:在PHP中只允許在當前函式自己內部中使用
函數週期:函式執行結束(函式是在棧區中開闢獨立記憶體空間執行
超全域性變數:系統定義的變數(預定義變數:$_SERVER、$_POST等
所屬超全域性空間:沒有訪問限制(函式內外都可訪問)
超全域性變數會將全域性變數自動納入到$GLOBALS裡面,而$GLOBALs沒有作用域限制,所以能幫助區域性取訪問全域性變數,但必須用陣列方式。
<?php
$ a = 10; //最終會被系統納入到超全域性變數中:$GLOBALS['a']
function show(){
echo $GLOBALS['a'];
}
如果函式內部想呼叫外部變數:除了$GLOBALS 之外,通過引數傳值(如果要引用戰線,還可以使用引用傳值。
在PHP中還有一種方式,能實現全域性訪問區域性,同時區域性也可以訪問全域性:global關鍵字
global關鍵字: 一種在函式裡面定義變數的一種方式
- 如果使用global定義的變數名在外部存在(全域性變數),那麼系統直接指向外部全域性變數所指向的記憶體空間(同一變數,不同名字)
- 如果使用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關鍵字這一行
使用:
- 為了統計當前函式被呼叫次數(顯然也可以超全域性變數來統計
- 統籌函式多次呼叫得到的不同結果。(遞迴思想)
資料型別
指儲存的資料本身的型別,不是變數的型別。
PHP是一種弱型別語言,變數本身沒有資料型別。
八種資料型別
php中的資料分為三大類八小類
一、簡單資料型別
-
整型:int/integer,佔4個位元組,表示整數型別。
-
浮點型:float/double,佔8個位元組,表示小數或整型存不下的數
-
字串型:string,系統根據實際長度分配記憶體,表示字串(加引號)
-
布林型別:bool/boolean,表示布林型別,只有true 和 false
二、複合資料型別
-
物件型別:object,存放物件(面向物件)
-
陣列型別:array,儲存多個數據(一次性)
三、特殊資料結構型別
-
資源型別:resource,存放資源資料(PHP外部資料,eg:資料庫、檔案)
-
空型別:NULL,只有一個值,為NULL(不能運算)
資料型別轉換
在很多條件下,需要指定的資料型別,需要外部資料(PHP目前獲得的資料),轉換成目標資料型別。
兩種轉換方式
-
自動轉換:系統根據需求自己判定,自己轉換(用得多,效率低
-
強制(手動)轉換:人為根據需要的目標型別轉換。
強制轉換的規則:在變數前加
()
在裡面寫對應的型別(你想轉的),想轉NULL型別需要用unset();
注:1.在轉換中,用的比較多的是轉布林型別(判斷)和轉數值型別(算術運算)
2.其它型別轉bool型別:(詳見下面bool型別的表格)
說明:
-
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;
在這裡解釋一下:
- 如果表示式的值為true,得到表示式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 結果(可以沒有
}
/*呼叫函式*/
函式名([引數]); //定義時候有引數一定記得傳參
函式是在程式碼執行階段,碰到函式名字的時候才會呼叫,不是在編譯階段。
呼叫特點: 只要系統能在記憶體中找到對應的函式,就可以執行。(呼叫可在函式定義之前。
函式執行的記憶體分析
- 讀取程式碼進入到程式碼段(編譯:將程式碼編譯位元組碼儲存到記憶體
- 根據程式碼逐行執行
那麼無論在什麼位置都能呼叫函式就是因為:編譯和執行是分開的
函式命名規範
與變數的命名規則相同。不可以數字開頭。
建議命名的時候用名字代表函式功能
注:在一個腳本週期中,不允許出現同名函式。(通常在一個系統開發中,不會使用同名函式。
對引數的解釋
一、形參
形式引數,不具有實際意義的引數,在函式定義時使用的引數。(形參可以有多個,用逗號分隔。
二、實參
實際引數,具有實際意義的引數,在函式呼叫時使用的引數。
(傳入的實參,可以是變數或者其它有值的表示式:變數、常量、運算子計算結果。
形參是實參的載體。在實際呼叫的時候,資料以實參的形式傳遞給形參,給形參賦值以達到呼叫的效果。
<?php
function add($x,$y){echo $x + $y;}
$a = 1;
add($a,2);
注:
-
PHP中允許實參 >= 形參(個數),多餘的,函式內部不用而已。(不可以比形參少
-
PHP中理論上形參個數沒有限制
三、預設值
default value,指的是形參的預設值,在函式定義的時候,就給形參進行一個初始賦值;如果呼叫時候實參沒有給形參賦值,形參就會用定義的值參與運算。
通常用在,一定會有某個資料參與,但是可能通常是某個我們知道的值。
預設值存在的時候,可以不用傳入。
<?php
function minus($x = 0,$y = 0){echo $x + $y;}
注:
- 預設值的定義需要放在最後面(可以有多個),不能前面有而後面沒有。
- 每個獨立的函式中,函式名與形參名不衝突;在不同函式中也可以有相同的形參名
四、引用傳遞
實參在呼叫的時候,會將值賦給形參,但是本身沒關係。如果有時候想讓實參的值變換,需要引用傳值。(在形參名字前加地址符&,並且傳入的實參必須是變數!
<?php
function 函式名(&形參名){
//函式體;
}
函式名(引數)
//呼叫的時候,這個參必須是變數!
五、函式體
函式體:大括號裡面的所有程式碼。(基本你要用到的都能幹。
六、函式返回值
return,通過return關鍵字將函式的結果,返回給外部。(沒有return時,系統預設返回NULL。
<?php
function add($x,$y){return $x + $y;}
//與上面不同的是這裡用的是return。
$a = add(1,2);
//可以定義變數來接收這個值
注:
- 函式返回值可以是任意資料型別。
- return不僅可以返回結果,也標誌著被呼叫函式結束執行。
- 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並沒有被釋放。