PHP進階之路 -- PHP基礎語法php
1、windows環境下php環境 html
搭建環境對於每一個開發者來講,是必需要掌握的技能,可是對於剛剛接觸開發沒多久的同窗來講,徹底沒有必要把大把的時間花費在搭建環境的身上,想要學習搭建環境,徹底能夠等到後期再來研究,在學習的初期,徹底能夠怎麼方便怎麼快就怎麼來。mysql
在windows中,能夠選擇單獨安裝環境,也能夠選擇安裝集成環境。web
可是有意思的是,咱們若是單獨的下載php環境須要的文件,會發現任何一個文件都超過百M,可是若是咱們安裝集成環境,你會發現集成環境的大小都要遠遠小於獨立下載的文件。而出現這種狀況的緣由是由於獨立的文件裏面包含了軟件的所有服務,而咱們單獨下載的集成環境則省略了不少內容,因此才致使文件大小不一樣。sql
那麼對於剛剛入行的學員來講,採用集成環境可以減小配置繁瑣環境的時間以及沒必要要的麻煩。shell
目前國內比較好用的集成環境有不少,例如,wampserver ,phpstudy等等.在本次授課中,推薦使用phpstudy這款集成環境,中文界面,能夠調整多個版本的php等等。編程
在安裝完成以後須要對系統的環境變量進行配置,將php目錄路徑和mysql目錄路徑寫入到環境變量當中,從而保證開發中的使用。windows
2、php定界符 後端
php能作不少事,可是目前來說,更多的是進行web開發,因此說php會常常和html打交道,而php是能夠放在html代碼的任何位置,以<? 開始,以?>結束。可是須要注意的是,php和html代碼結合 存儲代碼的文件後綴必須是.php。數組
1 文件後綴必須是.php 2 <!doctype html> 3 <html> 4 <body> 5 <h1><?php echo "hello,world" ?></h1> 6 </body> 7 </html>
3、php變量
在不少的語言中,變量都是相當重要的一項。
變量主要存儲數據,從而方便開發者們的邏輯業務處理。
php程序中聲明一個變量使用$這個美圓符號來表示,例如$a,就是採用美圓符號加變量名組合的形式來聲明變量。變量一旦聲明以後會被存儲在內存中,直到腳本結束自動銷燬或者人爲銷燬。
聲明一個變量一般狀況下須要遵循一些規則,例如:
一般狀況下,咱們使用變量是爲了存儲數據,而變量自己並無意義。
php自己是一門弱類型語言,因此,咱們在給變量進行賦值的時候,變量的類型會隨着值得變化而變化。
例如:
$a = 「hello」; // string
$a = array(); // array
咱們在程序開發的時候,一般須要預留變量,簡單的說就是咱們可能預料到在後期會用到一個變量用作存儲數據,那麼咱們就能夠提早聲明變量,可是變量暫時並不須要值,這個時候咱們就能夠給變量賦值爲null。
變量做用域
做用域的意思是說變量的生效範圍,在php中存在四個範圍:local(局部做用域)、global(全局做用域)、static(靜態)、parameter(參數)。
首先來講一下全局做用域和局部做用域:
在一個php文件中,若是在函數外面聲明的變量,就是全局變量,做用域範圍爲全局;而在函數內部聲明的變量就是局部變量,做用域僅限於函數內部。
那麼做用域範圍對php有什麼影響嗎?
有的,例如,局部變量只能在函數內部使用,在函數外部將沒法使用,那麼沒法使用的緣由是由於當函數執行完畢以後這個變量就已經被銷燬了。
再說全局變量,全局變量能夠在函數中使用,可是必須經過global關鍵字來使用,不然系統會拋出錯誤提示。
而static則表示靜態變量。可以讓變量中止銷燬。
上面的代碼輸出結果爲 2 , 2。若是此時$a 變爲static:
那麼輸出結果爲2 , 3 。
緣由是static 變量可以讓變量即便在函數被銷燬的狀況下也能得以保存。
最後說一下函數的參數,函數的參數由於函數的限制,因此只可以在函數內部使用,因此說函數參數的做用域也僅僅停留在函數當中,至關於局部變量。
4、數據類型
數據是一個項目或者說一個網站的核心,而先後端的通訊說白了就是對數據操做。而對於不一樣的開發語言來講,爲了實現本身某些特性,都會在基礎的數據類型上進行更改,可是從宏觀來看,其實不少語言的數據類型都是很類似的。
在php中,存在的數據類型以下:
上面的8種數據類型種,複合類型有array 和 object ,兩種特殊類型爲resource 和 null。
數據類型簡單介紹
字符串類型:
字符串類型是比較常見的類型,建立一個字符串主要經過單引號或者雙引號來進行建立,雖然兩者都是用來建立字符串類型,可是仍是有必定的細微的區別。
經過單引號建立的字符串,是不能夠解析變量的,可是功能的缺失卻換來了速度的提高,因此說,若是在字符串中沒有須要解析的變量,那麼就使用單引號是最好的。
而雙引號的建立的字符串,由於能夠解析變量,因此在某些對字符串的操做時是常用的。
$a = 「hello,world!」;
$b = ‘how are you ?’;
$c = 「lilei,$a」; // 輸出的結果爲lilei,hello,world!
整型:
整數,顧名思義,就是沒有小數位的數字。
那麼php對於整數的定義也有着一些須要注意的規則:
①整數必須至少有一個數字
②整數不能包含逗號或者空格
③整數不能有小數點
④整數正負都可
⑤能夠用三種格式規定整數:十進制、十六進制、或者八進制。
浮點:
浮點數就是有小數點或者指數形式的數字。
在使用的過程當中,浮點數既能夠用來存儲小數,也能夠用來存儲整數。
布爾:
布爾型在任何一門語言當中都是比較常見的數據類型之一,它有兩個值,true/false。
數組:
數組能夠說是一組數據的集合,它把一系列的數據組織存儲起來,造成一個能夠操做的總體。數組中能夠包含不少的數據類型,例如字符串、布爾、浮點,甚至能夠包括對象以及資源類型。
數組中的每個數據稱之爲元素,元素包括索引值(鍵名)和值兩個部分。索引能夠是數字或者字符組成,也能夠是默認由數組分配的值。
對象:
可能在不少的教科書裏面對於「對象」都有着大篇幅的介紹和概念理論,可是簡單點說,對象就是存儲數據和有關處理數據信息的一種數據類型。
而若是想要去建立一個對象,在php中須要先聲明一個類,再由類演化成對象。
例以下面的代碼,咱們經過類來建立一個對象。
Null空值:
null是一種較爲特殊的類型,表示變量爲空的一種狀態,NULL類型裏面惟一的值就是null。
一般狀況下用在給預留變量賦值使用。
資源:
資源類型表明的是經過php去讀取某些文件的時候,返回的數據類型,例如經過函數讀取了一個txt文件,那麼返回值就是一個資源類型。
5、數據類型轉換
php是一門弱類型語言,由於咱們在聲明一個變量 的時候,並不須要指明它保存的數據類型,可是PHP雖然是弱語言,但有時候仍然須要用到類型轉換。
php容許轉換的列表以下:
在php中轉換數據類型,有三種轉換方法:
第一種,只須要在要轉換的變量以前加上用括號括起來的類型名稱便可,像下面這樣:
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: liujunhang 5 * Date: 2018/6/18 6 * Time: 22:05 7 */ 8 $num1 = 3.14; 9 $num2 = (int)$num1; 10 var_dump($num1); // float(3.14) 11 var_dump($num2); // int(3)
第二種,使用3個具體類型的轉換函數,intval()、floatval()、strval():
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: liujunhang 5 * Date: 2018/6/18 6 * Time: 22:05 7 */ 8 9 $a = "123.43abc"; 10 $int = intval($a); // 轉換成整型 11 var_dump($int); // int(123) 12 $float = floatval($a); // 轉換成浮點 13 var_dump($float); // float(123.43) 14 $str = strval($a); // 轉換成字符串 15 var_dump($str); // string(9) "123.43abc"
第三種,使用settype()函數,該函數能夠將指定的變量轉換成指定的數據類型,語法以下:
settype(mixed
var
,string type)
參數var爲指定的變量;參數type爲指定的數據類型。參數type有7個可選值,即boolean,float,integer,array,null,object和string,若是轉換成功setype()函數返回true,不然返回false。
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: liujunhang 5 * Date: 2018/6/18 6 * Time: 22:05 7 */ 8 $num = 12.9; 9 $flag = settype($num,"int"); 10 var_dump($flag); // bool(true) 11 var_dump($num); // int(12)
當字符串轉換爲整型或浮點型時,若是字符串是以數字開頭的,就會先把數字部分轉換爲整型,在捨去後面的字符串;若是數字中含有小數點,則會取到小數前一位。
6、檢測數據類型
咱們在開發的過程當中常常碰到須要監測數據類型,從而作出判斷,咱們能夠根據下面的這些方法來進行監測:
7、php中三種輸出方式
在php中基礎的輸出方式有echo、print,以及var_dump三種方式。
其中echo可以輸出一個或者多個字符串,而print僅可以輸出一個字符串。var_dump能夠打印數據而且返回數據類型。
8、php字符集設置
php是一門跨平臺的語言,因此也就致使了相同的代碼在不一樣的平臺上由於不一樣平臺的差別從而不能很好的運行下去,這其中字符集編碼就是常常出現的問題,而爲了解決這個問題,咱們就須要在代碼中進行字符集編碼設置。
設置字符集能夠採用下面這條代碼:
header("Content-type:text/html;Charset=utf-8");
9、php常量
php常量相似於變量,可是常量一旦被定義就沒法更改或者撤銷定義。而常量名一般是以字符或者下劃線開頭(常量名前面並無$符號)。
設置php常量,須要使用define()函數,define函數有三個參數:
可選的第三個參數規定常量名是否對大小寫敏感。默認是false。
常量在項目的開發中使用的頻率很是高,一般狀況下用於設定一些配置參數或者固定的參數。常量默認的做用域爲全局。
10、php字符串詳解
上面咱們說到,建立一個字符串須要單引號或者雙引號,而一個字符串string就是由一系列的字符組成,其中每一個字符至關於一個字節。須要注意的是php 的string 最大能夠達到2GB。
建立一個字符串除了上面咱們說的兩種常見的使用方式,還有另外的兩種方式,下面對這四種使用方式進行展現:
上面對字符串的四種方式簡單的應用了一下:
①雙引號
②單引號
③heredoc
④nowdoc
在Heredoc 結構中,同雙引號同樣是能夠進行解析工做的。以下:
Heredoc還能夠進行再複雜一點的操做:
甚至在須要的時候還能夠進行傳參。
Tip:在字符串操做的時候,不管是雙引號仍是Heredoc結構均可以解析變量,這其中解析能夠直接將變量寫在裏面使用,可是一旦進行稍微複雜一點的操做,例如上面對象查詢屬性等操做,就須要使用{},由於{}在字符串裏不解析,因此能夠將表達式寫在{}裏面,可是必須和美圓符號緊貼。
11、php運算符
運算符是能夠經過給出的一或多個值(用編程行話來講,表達式)來產生另外一個值(於是整個結構成爲一個表達式)的東西。
運算符可按照其能接受幾個值來分組。一元運算符只能接受一個值,例如 !(邏輯取反運算符)或 ++(遞增運算符)。 二元運算符可接受兩個值,例如熟悉的算術運算符 +(加)和 -(減),大多數 PHP 運算符都是這種。最後是惟一的三元運算符 ? :,可接受三個值;一般就簡單稱之爲「三元運算符」(儘管稱之爲條件運算符可能更合適)。
php的運算符在開發當中是必不可少的內容,可是就如同咱們學習小學數學同樣,也是一樣具備前後順序的。
下面咱們來講一下運算符的優先級。
運算符優先級指定了兩個表達式綁定得有多「緊密」。例如,表達式 1 + 5 * 3 的結果是 16 而不是 18 是由於乘號(「*」)的優先級比加號(「+」)高。必要時能夠用括號來強制改變優先級。例如:(1 + 5) * 3 的值爲 18。
若是運算符優先級相同,那運算符的結合方向決定了該如何運算。例如,"-"是左聯的,那麼 1 - 2 - 3 就等同於 (1 - 2) - 3 而且結果是 -4. 另一方面,"="是右聯的,因此 $a = $b = $c 等同於 $a = ($b = $c)。沒有結合的相同優先級的運算符不能連在一塊兒使用,例如 1 < 2 > 1 在PHP是不合法的。但另一方面表達式 1 <= 1 == 1 是合法的, 由於 == 的優先級低於 <=。
括號的使用,哪怕在不是必要的場合下,經過括號的配對來明確標明運算順序,而非靠運算符優先級和結合性來決定,一般可以增長代碼的可讀性。
下表是官方文檔裏面對於運算符優先級給出的定義,在這裏並不強調你們所有記住,在編寫表達式的時候咱們徹底能夠靈活的運用小括號()這種形式來提高優先級。
諸位同窗是否還記得學校裏學到的基礎數學知識?就和他們同樣。
經過上面的算術運算符進行表達式運算很簡單,可是也有一些須要注意的點:
除法運算符老是返回浮點數。只有在下面的狀況下例外:兩個操做數都是整數(或字符串轉換成的整數)而且正好能整除,這是它返回一個整數。
取模運算符的操做數在運算以前都會轉換成整數(除去小數部分)。
取模運算符%的結果和被除數的符號(正負號)相同。即$a % $b 的結果的符號和$a的符號相同。
在php中,賦值運算符(=) 與 數學中的「等於」是不一樣的,賦值運算符至關於把右邊表達式的值賦給左邊的運算數。
除了上述的基礎賦值運算符,還有適合於全部二元算數,數組集合和字符串運算符的」組合運算符」,這樣能夠在一個表達式中使用它的值並把表達式的結果賦給它。
處理上面例子裏面的+=,.=之外,不少運算符都是能夠組合的,例如-= ,*= 等等。
在php中存在引用賦值的使用方式。
位運算符容許對整型數中指定的位數進行求值操做。
位移在 PHP 中是數學運算。向任何方向移出去的位都被丟棄。左移時右側以零填充,符號位被移走意味着正負號不被保留。右移時左側以符號位填充,意味着正負號被保留。
就如同名字所暗示的,比較運算符容許對兩個值進行比較。
若是比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換爲數值而且比較按照數值來進行。此規則也適用於 switch 語句。當用 === 或 !== 進行比較時則不進行類型轉換,由於此時類型和數值都要比對。
對於多種類型,比較運算符會根據下標進行比較:
Tip:由於浮點數float的內部表達式,因此不該該比較兩個浮點數是否相等。
三元運算符
三元運算符至關於簡化版的if判斷,以?:來組成三元運算符。
從php5.3開始,能夠省略中間的部分,例以下面:
Tip:儘量的不要將三元運算符堆積在一塊兒使用,會形成php語句不清晰。
php中存在錯誤抑止符,也叫錯誤控制運算符,是一個簡單的@符號,那麼將@符號放置在表達式的前面就可以屏蔽掉表達式中的存錯,可是這種寫法在實際開發中是禁止使用的,由於咱們看見的報錯實際上是程序和咱們之間的交互,經過錯誤告訴咱們哪裏出了問題,可是一旦咱們將這種錯誤屏蔽掉,可能直接致使項目沒法運行可是卻什麼錯誤都看不到。
執行運算符,顧名思義,就是隻要被執行運算符包裹的代碼都至關於一條命令是能夠執行的。
PHP 將嘗試將反引號中的內容做爲 shell 命令來執行,並將其輸出信息返回(即,能夠賦給一個變量而不是簡單地丟棄到標準輸出)。使用反引號運算符「`」的效果與函數 shell_exec() 相同。
例如上面的代碼,咱們是將執行運算符獲得的結果內容存儲到一個變量中而且輸出。
須要注意的是,反引號運算符在激活了安全模式或者關閉了shell_exec()時是無效的。同時,反引號不可以在雙引號字符串中使用。
PHP支持c風格的前/後遞減與遞增運算符。
Tip:遞增/遞減並不影響布爾值,遞減Null值也沒有效果,可是遞增null值得結果爲1.
在處理字符變量的算數運算時,PHP 沿襲了 Perl 的習慣,而非 C 的。例如,在 Perl 中 $a = 'Z'; $a++; 將把 $a 變成'AA',而在 C 中,a = 'Z'; a++; 將把 a 變成 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。注意字符變量只能遞增,不能遞減,而且只支持純字母(a-z 和 A-Z)。遞增/遞減其餘字符變量則無效,原字符串沒有變化。
主要是對邏輯操做起到輔助做用。
在php中,存在兩個字符串運算符。
第一個是 ‘ . ’ ,第二個是’.=’。
. 返回的是左右連接後的字符串,第二個是將右邊的參數附加到左邊的參數以後。
+ 運算符把右邊的數組元素附加到左邊的數組後面,兩個數組中都有的鍵名,則只使用左邊數組的,右邊的被忽略。
instanceof 用於肯定一個php變量是否屬於某一類class的實例。
12、php數組
PHP 中的數組其實是一個有序映射。映射是一種把 values 關聯到 keys 的類型。此類型在不少方面作了優化,所以能夠把它當成真正的數組,或列表(向量),散列表(是映射的一種實現),字典,集合,棧,隊列以及更多可能性。因爲數組元素的值也能夠是另外一個數組,樹形結構和多維數組也是容許的。
可使用array() 來定義一個數組。它接受任意數量用逗號分隔的鍵(key) =>值(value)對。
key能夠是一個整數integer或者字符串string 。
value 值能夠是任意類型的值。
在單行數組當中,最後一個數組單元的逗號能夠省略,例如array(1,2) 。
在多行數組當中,最後一個數組單元的後面一般狀況下要保留一個逗號,這樣添加新單元的時候方便。
Tip:自php5.4起,可使用短數組定義語法,用[]代替array()。
Tip:key能夠是int或者string,value能夠是任意類型。
此外 key 會有以下的強制轉換:
①包含有合法整型值的字符串會被轉換爲整型。例如鍵名 "8" 實際會被儲存爲 8。可是 "08" 則不會強制轉換,由於其不是一個合法的十進制數值。
②浮點數也會被轉換爲整型,意味着其小數部分會被捨去。例如鍵名 8.7 實際會被儲存爲 8。
③布爾值也會被轉換成整型。即鍵名 true 實際會被儲存爲 1 而鍵名 false 會被儲存爲 0。
④Null 會被轉換爲空字符串,即鍵名 null 實際會被儲存爲 ""。
⑤數組和對象不能被用爲鍵名。堅持這麼作會致使警告:Illegal offset type。
Tip:在數組中定義了多個單元都使用了同一個鍵名,則只使用了最後一個,以前的都被覆蓋了。
在使用php數組的時候,php數組能夠同時含有integer和string類型的鍵名,由於php實際並不區分索引數組和關聯數組。若是數組中沒有給定鍵名,那麼則取當前最大的索引值,新的鍵名將該值加一。若是指定的鍵名已經有了值,則該值會被覆蓋。
下面是一個包含int鍵值和string鍵值的數組:
在上面的例子中存在一個咱們沒有設置鍵的元素,系統會默認分配給它一個鍵,而這個鍵是當前最大int類型的鍵值+1.
當咱們須要訪問數組元素的時候,能夠採用[] 這樣的形式。
咱們也能夠經過{} 的形式訪問數組元素。
在php5.4以後咱們能夠直接在函數中引用數組,以下:
上面的這種寫法在以前是不能夠的。
若是想要添加和修改數組元素,一樣能夠採用方括號的形式。
若是要刪除某個數組元素,可使用unset()方法。
當咱們進行刪除操做時,有一種狀況是須要注意的:
在上面的代碼中,咱們清空了一個數組,而後從新向數組中注入新的值,而且沒有給值設置索引,那麼新添加的這個值採用的索引就是以前刪除的數組最大的數值索引+1。
Tip:unset()函數容許刪除數組中的某個鍵,可是注意數組將不會重建索引。若是要刪除後重建索引,可使用array_values()函數。
十3、PHP超全局變量
超全局變量 — 超全局變量是在所有做用域中始終可用的內置變量。
PHP 中的許多預約義變量都是「超全局的」,這意味着它們在一個腳本的所有做用域中均可用。在函數或方法中無需執行 global $variable; 就能夠訪問它們。
這些超全局變量是:
引用全局做用域中可用的所有變量。$GLOBALS自己就是一個數組,一個包含了所有變量的全局組合數組。變量的名字就是數組的鍵。
Tip: $GLOBALS 也稱之爲自動化的全局變量。這表示能夠在全局的任何地方使用它。
$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器建立。不能保證每一個服務器都提供所有項目;服務器可能會忽略一些,或者提供一些沒有在這裏列舉出來的項目。
具體信息能夠參考:https://www.cnblogs.com/liujunhang/articles/9178070.html
經過url參數傳遞給當前腳本的變量的數組。一般狀況下用於表單傳遞。
例以下面的實例(注意,php代碼和html代碼在同一個頁面):
當咱們提交過一次留言後,能夠看到瀏覽器url已經發生了變化。
當HTTP POST 請求的Content-Type 是 application/x-www-form-urlencoded 或multipart/form-data 時,會將變量以關聯數組形式傳入當前腳本。
在上面咱們使用了get方式進行了html和php數據交互,咱們能夠將get方法換成post方法。
$_REQUEST - HTTP request 變量。
默認狀況下包括了$_GET、$_POST 和$_COOKIE 的數組。
上面幾個是常見的超全局變量。還有一些其餘的超全局變量暫時是咱們用不到的,而且使用頻率不是很高,後面須要在來講。
十4、php流程控制
任何 PHP 腳本都是由一系列語句構成的。一條語句能夠是一個賦值語句,一個函數調用,一個循環,一個條件語句或者甚至是一個什麼也不作的語句(空語句)。語句一般以分號結束。此外,還能夠用花括號將一組語句封裝成一個語句組。語句組自己能夠看成是一行語句。
if else 語句能夠根據條件進行判斷,若是知足條件執行對應的代碼。
還有下面的一些變化,例如在html中知足條件輸出內容:
當咱們在開發中若是須要進行批量的重複性的工做,就能夠在代碼中開啓一個循環,讓php幫你去執行和重複。
while循環語句
語法:
while (expr):
statement
....
endwhile;
例以下面就是兩個簡單的循環的例子:
do while循環語句
do while循環語句和while很類似,不一樣的是表達式的值是在每次循環結束時檢查而不是在循環開始時檢查。而且和通常的循環不一樣的是,即便開始的時候條件就爲false,do while也會執行一次。
for循環
php中的for循環與c語言相似,基礎的語法以下:
for(條件1;條件2;條件3){
coding
}
須要注意的是三個條件的執行時機:
條件1 會在循環開始前執行一次,
條件2會在每次循環開始前進行判斷,若是爲true,那麼執行循環
條件3會在每次循環後開始執行
看下面的例子,體會三條條件執行的時機:
for循環一樣還有另一種寫法:
假設有一個數組,咱們須要取出數組中全部的值進行某些操做,咱們就可使用循環來完成,由於這種重複性較高的工做循環的效率遠遠超過咱們本身一個個取值。
foreach 遍歷數組
上面的代碼中,咱們經過for循環遍歷了數組,將數組中的值取了出來,可是在php中,給咱們提供了一個專門用來遍歷數組的方法foreach。
foreach僅可以應用於數組和對象。
基礎語法以下:
foreach ($array as $value){}
foreach($array as $key => $value){}
break
break關鍵字可以結束當前的for,foreach,while,do-while或者switch等結構。同時,break可以接受一個可選的參數來決定可以跳出幾層循環。
下面的實例是在for循環裏面嵌套switch,再經過break進行指定層數跳轉。
continue 跳過本次循環
在循環中,咱們能夠經過continue來跳過本次循環,可是循環依舊繼續。
switch 語句
switch語句的功能很相似if判斷,能夠先來看下面的例子:
上面是switch的用法和實例,咱們在使用的時候還能夠對switch寫法上進行一些變化:
上面是switch的兩種寫法,固然,在實際應用中並不強制使用哪一種方式,而是哪一種使用更方便就使用哪一種。
不管是require仍是include ,兩者都是用來引入文件,並且兩者幾乎同樣,除了處理失敗的方式不一樣以外。
require 在錯誤產生時產生E_NOTICE級別的錯誤,換句話說會致使腳本中止運行。
include會產生E_WARINE警告,程序會繼續執行。
和上面兩位的用法同樣,只不過使用require_once 和 include_once的時候,會檢查是否已經引用,若是文件已經引用將再也不引用。
上面的四位,實際上是咱們在項目開發中常用的方法,例如進行web開發的時候,網頁的開頭和結尾都是相同的,咱們就沒有必要去每一個網頁都寫一份開頭和結尾,而是隻寫一份,放在公用的目錄中,每一個網頁中只引用一次便可。
goto操做符能夠用來跳轉到程序的另一個位置。php中對goto存在必定的限制,目標位置只能位於同一個文件和做用域,也就是沒法跳出一個函數或類方法,也沒法跳入到另外一個函數。也沒法跳入到任何循環或者 switch 結構中。能夠跳出循環或者 switch,一般的用法是用 goto 代替多層的 break。
15.php函數
在開發過程當中,或者說在項目的功能業務實現的過程當中,咱們會常常碰到代碼重複的現象,而爲了節約開發時間和成本(主要是由於懶),咱們就能夠將這些重複的代碼進行封裝,封裝成函數,一次封裝,重複調用,就能夠擺脫這種麻煩。
而php的強大的緣由之一就是官方給咱們封裝了不少不少的功能性函數,例如咱們以前用到的var_dump(),就是一個封裝好的函數。
咱們也能夠根據本身的需求進行函數自定義封裝。
咱們能夠將用戶登陸這種經常使用的功能進行一下函數的封裝。
上面的代碼是咱們根據需求寫的一段僞代碼,那麼在真實的開發環境下是須要更加嚴謹和複雜的,咱們只是簡單的模擬下。
那麼在進行函數的封裝的時候,咱們須要注意的點有三個:第一個是函數的說明,一般狀況下寫在函數的上面,目的是爲了往後團隊他人調用的方便,其次在程序的關鍵步驟進行註釋,由於不少時候,咱們本身以前敲過的代碼可能過了好久後本身也會忘掉,因此寫好註釋可以在後期的維護和升級時起到很大的幫助。
上面咱們經過一段僞代碼簡單的說了一下函數封裝,下面咱們來演示一下函數的參數問題,
須要知道的是,形參的做用範圍僅限於函數內部,在函數外部則無法使用。
一般狀況下,咱們在函數中進行操做的變量是沒辦法在函數外部的做用域直接訪問的,若是咱們須要函數裏面的數據,咱們能夠經過return來將數據進行返回,做爲調用這個函數產生的返回值返回到函數的外面。從而在函數的外面進行其餘業務操做。
在php中,還有一種很重要的函數,就是下面咱們要說的匿名函數。
匿名函數(anonymous functions ) ,也叫閉包函數(closures),容許臨時建立一個沒有指定名稱的函數。最常常用做回調函數(callback)參數的值。固然也有其餘的應用狀況。
例以下面就是一個簡單的實例:
輸出結果:
在上面的實例中,咱們在使用preg_replace_callback()方法時,第二個參數則是一個匿名函數,也能夠稱之爲閉包函數 。
在這須要強調的是,php中的閉包函數跟傳統的閉包函數寫法是有些區別的,例如在JavaScript中的閉包函數寫法以下:
可是在php中並不存在這種傳統的閉包函數,若是站在子函數能夠調用父域內的變量這種角度來定義閉包函數,那麼在php中,可使用use。
例以下面的例子,函數經過use關鍵字來調用父域中的變量,另外,下面例子中的匿名函數被存儲在變量中也是一種常見的寫法。
在使用函數時,咱們也能夠經過函數的形參列表將函數傳入。
16. php魔術常量