來源:PHP基礎(chǔ)參考02-基礎(chǔ)語(yǔ)法參考1 - 9ong PHP基礎(chǔ)參考03-基礎(chǔ)語(yǔ)法參考2 - 9ong
基本語(yǔ)法
-
PHP標(biāo)記
如果文件內(nèi)容是純 PHP 代碼,最好在文件末尾刪除 PHP 結(jié)束標(biāo)記。這可以避免在 PHP 結(jié)束標(biāo)記之后萬一意外加入了空格或者換行符,會(huì)導(dǎo)致 PHP 開始輸出這些空白,而腳本中此時(shí)并無輸出的意圖。
-
PHP文件智能混合內(nèi)容
常用于分離HTML文件。如果懂得這個(gè)知識(shí)點(diǎn),不僅僅可以用于分離HTML文件。
凡是在一對(duì)開始和結(jié)束標(biāo)記之外的內(nèi)容都會(huì)被 PHP 解析器忽略,這使得 PHP 文件可以具備混合內(nèi)容。 可以使 PHP 嵌入到 HTML 文檔中去。
<?php if ($expression == true): ?> This will show if the expression is true. <?php else: ?> Otherwise this will show. <?php endif; ?>
-
短標(biāo)記
短標(biāo)記僅在通過 php.ini 配置文件中的指令 short_open_tag 打開后才可用,或者在 PHP 編譯時(shí)加入了 --enable-short-tags 選項(xiàng)。
<? echo 'this is the simplest, an SGML processing instruction'; ?> <?= expression ?> This is a shortcut for "<? echo expression ?>"
還會(huì)看到有ASP 風(fēng)格標(biāo)記,僅在通過 php.ini 配置文件中的指令 asp_tags 打開后才可用。
<% echo 'You may optionally use ASP-style tags'; %> <%= $variable; # This is a shortcut for "<% echo . . ." %>
我們不建議使用短標(biāo)記。
類型
PHP 支持 10 種原始數(shù)據(jù)類型。
四種標(biāo)量類型:
- bool(布爾型)
- int(整型)
- float(浮點(diǎn)型,也稱作 double)
- string(字符串)
四種復(fù)合類型:
- array(數(shù)組)
- object(對(duì)象)
- callable(可調(diào)用)
- iterable(可迭代)
還有兩種特殊類型:
- resource(資源)
- NULL(無類型)
這里注意到關(guān)于“雙精度(double)”類型,實(shí)際上 double 和 float 是相同的,由于一些歷史的原因,這兩個(gè)名稱同時(shí)存在。
注意:變量的類型通常不是由程序員設(shè)定的,確切地說,是由 PHP 根據(jù)該變量使用的上下文在運(yùn)行時(shí)決定的。
弱類型語(yǔ)言php經(jīng)常被人吐槽的地方,但也會(huì)引起很多人喜歡,畢竟不需要人為過多的去考慮一些類型轉(zhuǎn)換。
-
布爾類型Boolean
PHP中true、false,不區(qū)分大小寫。
-
轉(zhuǎn)換為布爾值
要明確地將一個(gè)值轉(zhuǎn)換成 boolean,用 (bool) 或者 (boolean) 來強(qiáng)制轉(zhuǎn)換。但是很多情況下不需要用強(qiáng)制轉(zhuǎn)換,因?yàn)楫?dāng)運(yùn)算符,函數(shù)或者流程控制結(jié)構(gòu)需要一個(gè) boolean 參數(shù)時(shí),該值會(huì)被自動(dòng)轉(zhuǎn)換。詳見后續(xù)的類型轉(zhuǎn)換判別。
-
當(dāng)轉(zhuǎn)換為 boolean 時(shí),以下值被認(rèn)為是 false:
布爾值 false 本身 整型值 0(零)及 -0 (零) 浮點(diǎn)型值 0.0(零)-0.0(零) 空字符串,以及字符串 "0" 不包括任何元素的數(shù)組 特殊類型 NULL(包括尚未賦值的變量) 從空標(biāo)記生成的 SimpleXML 對(duì)象
所有其它值都被認(rèn)為是 true(包括任何資源resource 和 NAN)。
-
整型Integer
-
支持多種進(jìn)制整型
整型值可以使用十進(jìn)制,十六進(jìn)制,八進(jìn)制或二進(jìn)制表示,前面可以加上可選的符號(hào)(- 或者 +)。 可以用 負(fù)運(yùn)算符 來表示一個(gè)負(fù)的integer。
要使用八進(jìn)制表達(dá),數(shù)字前必須加上 0(零)。要使用十六進(jìn)制表達(dá),數(shù)字前必須加上 0x。要使用二進(jìn)制表達(dá),數(shù)字前必須加上 0b。
-
7.4后支持下劃線
$a = 1_234_567; // 整型數(shù)值 (PHP 7.4.0 以后)
-
整型溢出會(huì)被解釋為float。
如果給定的一個(gè)數(shù)超出了 integer 的范圍,將會(huì)被解釋為 float。同樣如果執(zhí)行的運(yùn)算結(jié)果超出了 integer 范圍,也會(huì)返回 float。
-
php沒有整除運(yùn)算符的
PHP 中沒有整除的運(yùn)算符。1/2 產(chǎn)生出 float 0.5。 值可以舍棄小數(shù)部分,強(qiáng)制轉(zhuǎn)換為 integer,或者使用 round() 函數(shù)可以更好地進(jìn)行四舍五入。
注意: 從 PHP 7.0.0 開始,函數(shù) intdiv() 可以用于整數(shù)除法
-
轉(zhuǎn)換為整型
要明確地將一個(gè)值轉(zhuǎn)換為 integer,用 (int) 或 (integer) 強(qiáng)制轉(zhuǎn)換。還是那句話,大多情況下,不需要強(qiáng)制轉(zhuǎn)換類型,因?yàn)楫?dāng)運(yùn)算符,函數(shù)或流程控制需要一個(gè) integer 參數(shù)時(shí),值會(huì)自動(dòng)轉(zhuǎn)換。還可以通過函數(shù) intval() 來將一個(gè)值轉(zhuǎn)換成整型。類型轉(zhuǎn)換的判別
null會(huì)轉(zhuǎn)化為0。
false 將產(chǎn)生出 0(零),true 將產(chǎn)生出 1。
當(dāng)從浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)時(shí),將向下取整。
PHP 7.0.0 起,NaN 和 Infinity 在轉(zhuǎn)換成 integer 時(shí),不再是 undefined 或者依賴于平臺(tái),而是都會(huì)變成0。
-
-
Float浮點(diǎn)型
永遠(yuǎn)不要相信浮點(diǎn)數(shù)結(jié)果精確到了最后一位,也永遠(yuǎn)不要比較兩個(gè)浮點(diǎn)數(shù)是否相等。如果確實(shí)需要更高的精度,應(yīng)該使用任意精度數(shù)學(xué)函數(shù)PHP: BC 數(shù)學(xué) 函數(shù) - Manual或者 PHP: GMP 函數(shù) - Manual。
-
String字符串
一個(gè)字符串 string 就是由一系列的字符組成,其中每個(gè)字符等同于一個(gè)字節(jié)。 這意味著 PHP 只能支持 256 的字符集,因此不支持 Unicode 。(一個(gè)字節(jié)8位,只能支持256的字符集,對(duì)于多字節(jié)的unicode,我們經(jīng)常會(huì)用到mbstring的擴(kuò)展)
注意: string 最大可以達(dá)到 2GB。
- 語(yǔ)法
- 單引號(hào):不解析變量,不解析轉(zhuǎn)義字符
- 雙引號(hào):解析變量,解析轉(zhuǎn)義字符
- Heredoc
以<<<開頭定義一個(gè)結(jié)構(gòu):<<<LABEL
中間是字符串
結(jié)束時(shí)所引用的標(biāo)識(shí)符必須在該行的第一列,并以定義的結(jié)構(gòu)字符串為結(jié)尾LABEL;,注意分號(hào);。
```
$bar = <<<LABEL
i am a chinese
LABEL;
```
Heredoc效果類似于雙引號(hào)
- Newdoc
Newdoc效果類似于單引號(hào),不解析變量不解析轉(zhuǎn)義字符。
```
$bar = <<<'LABEL'
i am a chinese
LABEL;
```
-
Array數(shù)組
PHP 中的數(shù)組實(shí)際上是一個(gè)有序映射。映射是一種把 values 關(guān)聯(lián)到 keys 的類型。此類型在很多方面做了優(yōu)化,因此可以把它當(dāng)成真正的數(shù)組,或列表(向量),散列表(是映射的一種實(shí)現(xiàn)),字典,集合,棧,隊(duì)列以及更多可能性。由于數(shù)組元素的值也可以是另一個(gè)數(shù)組,樹形結(jié)構(gòu)和多維數(shù)組也是允許的。
-
key與value
php的數(shù)組實(shí)在是萬能,key 可以是 integer 或者 string。value 可以是任意類型,而且key相同時(shí),會(huì)覆蓋保留最后一個(gè)。當(dāng)然key是可選項(xiàng),未指定時(shí),PHP 將自動(dòng)使用之前用過的最大 integer 鍵名加上 1 作為新的鍵名。
-
轉(zhuǎn)換數(shù)組
(array)$value
對(duì)于任意 integer,float,string,boolean 和 resource 類型,如果將一個(gè)值轉(zhuǎn)換為數(shù)組,將得到一個(gè)僅有一個(gè)元素的數(shù)組,其下標(biāo)為 0,該元素即為此標(biāo)量的值。
如果一個(gè) object 類型轉(zhuǎn)換為 array,則結(jié)果為一個(gè)數(shù)組,其單元為該對(duì)象的屬性,經(jīng)常會(huì)有一些不可預(yù)知的行為。
-
- 數(shù)組函數(shù)
[數(shù)組函數(shù)](https://www.php.net/manual/zh/ref.array.php)
-
Iterable可迭代對(duì)象
-
Object對(duì)象
不建議將數(shù)組轉(zhuǎn)換成Object對(duì)象,在7.2前后的版本對(duì)于數(shù)組轉(zhuǎn)換成Object對(duì)象有不同的屬性值輸出。
-
Resource資源類型
資源 resource 是一種特殊變量,保存了到外部資源的一個(gè)引用。
資源類型變量保存有為打開文件、數(shù)據(jù)庫(kù)連接、圖形畫布區(qū)域等的特殊句柄。
-
資源釋放
引用計(jì)數(shù)系統(tǒng)是 Zend 引擎的一部分,可以自動(dòng)檢測(cè)到一個(gè)資源不再被引用了(和 Java 一樣)。這種情況下此資源使用的所有外部資源都會(huì)被垃圾回收系統(tǒng)釋放。因此,很少需要手工釋放內(nèi)存。
注意: 持久數(shù)據(jù)庫(kù)連接比較特殊,它們不會(huì)被垃圾回收系統(tǒng)銷毀。參見數(shù)據(jù)庫(kù)永久連接一章。
-
資源函數(shù)
資源是通過專門的函數(shù)來建立和使用的。
-
-
NULL
NULL的值就一個(gè):不區(qū)分大小寫的null。
callback類型
回調(diào)函數(shù):普通函數(shù)、匿名函數(shù)、對(duì)象的方法、靜態(tài)類方法
PHP是將函數(shù)以string形式傳遞的。
PHP是通過數(shù)組array傳遞對(duì)象的方法和靜態(tài)類的方法。
比如:一些函數(shù)如 call_user_func() 或 usort() 可以接受用戶自定義的回調(diào)函數(shù)作為參數(shù):
```php
// 普通定義的函數(shù)
call_user_func('my_callback_function');
// 靜態(tài)類方法
call_user_func(array('MyClass', 'myCallbackMethod'));
// 實(shí)例化對(duì)象方法
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// 靜態(tài)類方法2
call_user_func('MyClass::myCallbackMethod');
//匿名函數(shù)
call_user_func(function(...){....});
```
-
強(qiáng)制類型轉(zhuǎn)換
(int), (integer) - 轉(zhuǎn)換為整形 integer (bool), (boolean) - 轉(zhuǎn)換為布爾類型 boolean (float), (double), (real) - 轉(zhuǎn)換為浮點(diǎn)型 float (string) - 轉(zhuǎn)換為字符串 string (array) - 轉(zhuǎn)換為數(shù)組 array (object) - 轉(zhuǎn)換為對(duì)象 object (unset) - 轉(zhuǎn)換為 NULL // 不建議再使用,在php8中已經(jīng)移除
變量
-
傳值賦值與引用賦值
變量默認(rèn)總是傳值賦值。
PHP 也提供了另外一種方式給變量賦值:引用賦值。
使用引用賦值,簡(jiǎn)單地將一個(gè) & 符號(hào)加到將要賦值的變量前(源變量)
$foo = 'Bob'; // 將 'Bob' 賦給 $foo $bar = &$foo; // 通過 $bar 引用 $foo
注意:引用賦值,而不是傳址賦值,雖然兩者效果一樣。后面我們會(huì)說到這兩個(gè)區(qū)別
-
初始化變量
雖然在 PHP 中并不需要初始化變量,但對(duì)變量進(jìn)行初始化是個(gè)好習(xí)慣。
PHP: 預(yù)定義變量 - Manual,比如超全局變量
-
變量范圍
首先我們不建議使用global關(guān)鍵字來引入函數(shù)/方法以外的變量,可以的話通過傳參來實(shí)現(xiàn)。
-
有個(gè)特別注意的地方:大部分的 PHP 變量只有一個(gè)單獨(dú)的范圍。這個(gè)單獨(dú)的范圍跨度同樣包含了 include 和 require 引入的文件。例如:
$a = 1; include 'b.php';
變量$a將在b.php文件中生效。
- 遞歸中常用的靜態(tài)變量
通常會(huì)在一個(gè)遞歸中統(tǒng)計(jì)或累加數(shù)值,但由于遞歸函數(shù)屬于局部函數(shù),普通變量在函數(shù)再次被調(diào)用時(shí),會(huì)被釋放重新初始化。為了累計(jì)或累加數(shù)值,我們需要一個(gè)在函數(shù)再次被調(diào)用時(shí)不會(huì)被初始化的變量,那就是static的靜態(tài)變量
```php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
```
-
可變變量
個(gè)可變變量獲取了一個(gè)普通變量的值作為這個(gè)可變變量的變量名。在上面的例子中 hello 使用了兩個(gè)美元符號(hào)($)以后,就可以作為一個(gè)可變變量的變量了。例如:
$$a = 'world';
這時(shí),兩個(gè)變量都被定義了:
hello 的內(nèi)容是“world”。
注意了:$$a[1] 這怎么解析?是一種模棱兩可的變量,需要人為的定界:
${$a[1]} //或 ${$a}[1]
再注意了:超全局變量和$this都是特殊變量,不能被動(dòng)態(tài)引用為可變變量。
常量
-
定義常量
除了define函數(shù)外,還可以通過關(guān)鍵字const定義常量。一般為大寫。
使用 const 關(guān)鍵字定義常量必須處于最頂端的作用區(qū)域,因?yàn)橛么朔椒ㄊ窃诰幾g時(shí)定義的。這就意味著不能在函數(shù)內(nèi),循環(huán)內(nèi)以及 if 或 try/catch 語(yǔ)句之內(nèi)用 const 來定義常量。
-
支持?jǐn)?shù)組及表達(dá)式
php5.6之后,允許將常量定義為表達(dá)式。注意和類中的常量比較區(qū)別。
const HELO = "hello"; const HWWW = HELO." World";//表達(dá)式 const AAAA = ["a",'b'];
-
魔術(shù)常量
大家可能聽過php的魔術(shù)方法,現(xiàn)在我們看看魔術(shù)常量。
有些魔術(shù)常量的值隨著他們?cè)诖a中的位置改變而改變,比如line,__file__等,他們不區(qū)分大小寫。
php令人惱的就是不統(tǒng)一的有些大小寫敏感有些不區(qū)分大小寫。
表達(dá)式
PHP 是一種面向表達(dá)式的語(yǔ)言,從這一方面來講幾乎一切都是表達(dá)式。
沒有什么太多讓人意外的知識(shí)點(diǎn)。
運(yùn)算符
運(yùn)算符,通常會(huì)提到一元運(yùn)算符,比如與或非++--;二元運(yùn)算符,比如加減乘除;三元運(yùn)算符(條件運(yùn)算符),比如也是唯一的三元運(yùn)算符:?: 。
運(yùn)算符優(yōu)先級(jí)
-
算數(shù)運(yùn)算符
整除。php中是沒有整除運(yùn)算符的,/ 只是除法,總是會(huì)返回浮點(diǎn)數(shù),除非兩個(gè)操作數(shù)都是整數(shù),否則需要通過round或ceil再次取整獲得整數(shù),也可以通過intdiv函數(shù)。
求冪。5.6之后引入了求冪運(yùn)算符 ** ,
b ,求
b次方的值。
-
賦值運(yùn)算符
-
= 并不是等于的意思,而是將右邊表達(dá)式的值賦值給左邊的運(yùn)算數(shù)。
除非特別說明的Object對(duì)象外,php中的賦值都是傳值賦值,也就是拷貝賦值。即左右變量的變量互不影響。
-
引用賦值
這里又要先把object對(duì)象和其他類型分開說,object對(duì)象的賦值表達(dá)式默認(rèn)是傳址賦值,而其他類型默認(rèn)是傳值賦值,需要通過&=需要才能達(dá)到引用賦值效果(傳址賦值與引用賦值雖然效果一樣,但原理是不一樣的),object對(duì)象需要通過clone關(guān)鍵字才能做到傳值賦值(拷貝傳值)。
-
注意:new關(guān)鍵字就是返回一個(gè)引用,也就是引用賦值。
-
位運(yùn)算符
看理論都很好理解,但實(shí)際應(yīng)用,多少會(huì)有點(diǎn)懵逼的位運(yùn)算。
有一個(gè)php自帶的很好的案例,我們?cè)诠ぷ髟O(shè)計(jì)中也可以參考借鑒:
PHP 的 ini 設(shè)定 error_reporting 使用了按位的值, 提供了關(guān)閉某個(gè)位的真實(shí)例子。要顯示除了提示級(jí)別 之外的所有錯(cuò)誤,php.ini 中是這樣用的: E_ALL & ~E_NOTICE 具體運(yùn)作方式是先取得 E_ALL 的值: 00000000000000000111011111111111 再取得 E_NOTICE 的值: 00000000000000000000000000001000 然后通過 ~ 將其取反: 11111111111111111111111111110111 最后再用按位與 AND(&)得到兩個(gè)值中都設(shè)定了(為 1)的位: 00000000000000000111011111110111 error_reporting 也可用來演示怎樣置位。只顯示錯(cuò)誤和可恢復(fù) 錯(cuò)誤的方法是: E_ERROR | E_RECOVERABLE_ERROR 也就是將 E_ERROR 00000000000000000000000000000001 和 E_RECOVERABLE_ERROR 00000000000000000001000000000000 用按位或 OR(|)運(yùn)算符來取得在任何一個(gè)值中被置位的結(jié)果: 00000000000000000001000000000001
-
比較運(yùn)算符
-
全等 ===
全等大家都知道,再?gòu)?qiáng)調(diào)下,除了值相同外,類型也要相同。
也就是說php的==是在類型轉(zhuǎn)換后再比較兩個(gè)變量的值。而===不轉(zhuǎn)換類型,直接比較值和類型。
-
太空船(組合比較符) <=>
php7提供。太空船運(yùn)算符,不僅僅比較是否相等,還給出大小,返回-1、0、1的值,而不是Boolean值。
echo 1.5 <=> 1.5; // 返回0 相等 echo 1.5 <=> 2.5; // 返回-1 小于 echo 2.5 <=> 1.5; // 返回1 大于
當(dāng)然還可以比較字符串、數(shù)組、對(duì)象,但我們建議不要比較這些復(fù)雜的復(fù)合類型變量。
-
- 浮點(diǎn)數(shù)
在php中,不建議通過運(yùn)算符來比較浮點(diǎn)數(shù),特別是和金錢有關(guān)的浮點(diǎn)數(shù),金錢的設(shè)計(jì),盡量不要出現(xiàn)浮點(diǎn)數(shù),通過單位放大避免浮點(diǎn)數(shù)設(shè)計(jì)。
不得已下,浮點(diǎn)數(shù)要采用BC函數(shù)或?qū)iT的數(shù)學(xué)計(jì)算擴(kuò)展。
- 三元運(yùn)算符(條件判斷運(yùn)算符)
? :
在5.3以后,支持省去中間部分表達(dá)式:
```php
//$a = expr1 ? expr1 : expr3
$a = expr1 ? : expr3
```
上面的表達(dá)式意思是:如果expr1為true,則返回expr1,否則返回expr3。直接省略了中間表達(dá)式部分。
注意:表達(dá)式返回的是值,而不是引用。
- NULL合并運(yùn)算符
php7提供。支持簡(jiǎn)單嵌套。
這個(gè)表達(dá)式對(duì)于輸入頻繁檢查判斷的地方太有用了:
```php
// NULL 合并運(yùn)算符的例子
$default = "default";
$action = $_POST['action'] ?? $default ?? "default";
// 以上例子等同于于以下 if/else 語(yǔ)句
if (isset($_POST['action'])) {
$action = $_POST['action'];
} else {
$action = 'default';
}
```
注意:表達(dá)式返回的是值,而不是引用。
- 錯(cuò)誤控制運(yùn)算符
@ 當(dāng)將其放置在一個(gè) PHP 表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉。注意是表達(dá)式之前。
在現(xiàn)代編程思想中,我們不建議常使用他,盡量避免。
- 執(zhí)行運(yùn)算符
反引號(hào)(``)。注意這不是單引號(hào)!PHP 將嘗試將反引號(hào)中的內(nèi)容作為 shell 命令來執(zhí)行,并將其輸出信息返回(即,可以賦給一個(gè)變量而不是簡(jiǎn)單地丟棄到標(biāo)準(zhǔn)輸出)。使用反引號(hào)運(yùn)算符“`”的效果與函數(shù) shell_exec() 相同。
我們可以將其等同于shell_exec函數(shù),因?yàn)殛P(guān)閉了 shell_exec() 時(shí)反引號(hào)運(yùn)算符是無效的。所以我們還是建議使用shell_exec函數(shù)顯式的執(zhí)行更好些。
- 邏輯運(yùn)算符
邏輯運(yùn)算符,很多phper想到就是與或非: &&、 ||、 !這些符號(hào),其實(shí)還有and、or、xor(異或,兩個(gè)操作數(shù)不一樣時(shí)返回true)
- 數(shù)組運(yùn)算符
- 數(shù)組聯(lián)合+
合并兩個(gè)數(shù)組,如果存在相同的key,則用左邊第一個(gè)數(shù)組的key和value
```php
$arr = $array1 + $array2;
```
- 數(shù)組全等判斷
=== , 數(shù)組的全等條件:1、具有相同鍵值對(duì);2、順序一致;3、類型一樣。
- 類型運(yùn)算符
- instanceof
我們都知道instanceof可用于檢測(cè)實(shí)例是否某個(gè)類或其父類。
instanceof還可以檢測(cè)實(shí)例是否實(shí)現(xiàn)了某個(gè)接口。
流程控制
順序、條件、循環(huán)
if、elseif、else、while、for、foreach、continue、break、switch、case、return、include、require、goto等
-
流程控制替代語(yǔ)法
PHP 提供了一些流程控制的替代語(yǔ)法,包括 if,while,for,foreach 和 switch。替代語(yǔ)法的基本形式是把左花括號(hào)({)換成冒號(hào)(:),把右花括號(hào)(})分別換成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
我們還是建議使用花括號(hào)方式,了解這個(gè)特別之處為了方便閱讀舊php代碼。
-
do-while
do-while 循環(huán)和 while 循環(huán)非常相似,區(qū)別在于表達(dá)式的值是在每次循環(huán)結(jié)束時(shí)檢查而不是開始時(shí)。和一般的 while 循環(huán)主要的區(qū)別是 do-while 的循環(huán)語(yǔ)句保證會(huì)執(zhí)行一次。
適用于至少執(zhí)行一次的循環(huán)。
-
foreach
特別指出的是在foreach中可以通過&引用符號(hào)修改數(shù)組或?qū)ο蟮脑M。
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) unset($value); // 最后取消掉引用
-
break
php中的break可以接受一個(gè)可選的數(shù)字參數(shù)來決定跳出幾重循環(huán)。也就是說默認(rèn)break是跳出當(dāng)前循環(huán)也可以這么寫:
$a = 10; $arr = [....]; while($a<100>){ foreach($arr as $k=>$v){ if($v===2){ break 1;//和break;一樣 }elseif($v === 10){ break 2;//跳出foreach,還跳出while循環(huán) } //do something } $a += 10; }
-
continue
continue 接受一個(gè)可選的數(shù)字參數(shù)來決定跳過幾重循環(huán)到循環(huán)結(jié)尾。默認(rèn)值是 1,即跳到當(dāng)前循環(huán)末尾。
$a = 10; $arr = [....]; while($a<100>){ foreach($arr as $k=>$v){ if($v===2){ continue 1;//和continue;一樣,跳到當(dāng)前foreach循環(huán)結(jié)尾,執(zhí)行下一次foreach循環(huán) }elseif($v === 10){ continue 2;//跳出foreach,并跳到while循環(huán)的結(jié)尾,執(zhí)行下一次while循環(huán) } //do something } $a += 10; }
-
switch
為避免錯(cuò)誤,理解 switch 是怎樣執(zhí)行的非常重要。switch 語(yǔ)句一行接一行地執(zhí)行(實(shí)際上是語(yǔ)句接語(yǔ)句)。開始時(shí)沒有代碼被執(zhí)行。僅當(dāng)一個(gè) case 語(yǔ)句中的值和 switch 表達(dá)式的值匹配時(shí) PHP 才開始執(zhí)行語(yǔ)句,直到 switch 的程序段結(jié)束或者遇到第一個(gè) break 語(yǔ)句為止。如果不在 case 的語(yǔ)句段最后寫上 break 的話,PHP 將繼續(xù)執(zhí)行下一個(gè) case 中的語(yǔ)句段。
所以break在switch是很重要的,也是很容易犯錯(cuò)的。
如果switch嵌套在循環(huán)中,continue作用就類似于break,continue 1跳出switch結(jié)構(gòu)(可以把switch看做一次循環(huán),continue和break在一次循環(huán)中是一樣的效果的),continue 2跳出switch,并跳到外面一層循環(huán)的尾部,開始下一次外面一層循環(huán)。break 2同理,但是直接跳出switch和外面一層循環(huán)。
-
match
php8提供。
很不錯(cuò)的控制流程,與switch很相似,但又不一樣,match是強(qiáng)類型檢測(cè),switch/case是弱類型檢測(cè);match支持范圍判斷,switch只能是精確判斷;match結(jié)構(gòu)中條件表達(dá)式在花括號(hào)內(nèi)。switch/case是傳入條件,在case中檢測(cè)處理。
$return_value = match (subject_expression) { single_conditional_expression => return_expression, conditional_expression1, conditional_expression2 => return_expression, }; $expressionResult = match ($condition) { 1, 2 => foo(),//當(dāng)$condition值為1或2時(shí),執(zhí)行foo(),并返回結(jié)果 3, 4 => bar(), default => baz(),//不滿足以下條件1,2,3,4時(shí),默認(rèn)執(zhí)行default條件 }; $age = 23; $result = match (true) { $age >= 65 => 'senior', $age >= 25 => 'adult', $age >= 18 => 'young adult', default => 'kid', }; //string(11) "young adult"
-
declare
declare 結(jié)構(gòu)用來設(shè)定一段代碼的執(zhí)行指令。目前僅支持兩個(gè)指令:ticks及encoding
Tick(時(shí)鐘周期)是一個(gè)在 declare 代碼段中解釋器每執(zhí)行 N 條可計(jì)時(shí)的低級(jí)語(yǔ)句就會(huì)發(fā)生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 來指定的。
注意:是ticks條可計(jì)時(shí)的低級(jí)語(yǔ)句。不是所有語(yǔ)句都可計(jì)時(shí)。通常條件表達(dá)式和參數(shù)表達(dá)式都不可計(jì)時(shí)。
從register_tick_function('tick_handler')設(shè)定起開始算1條。
```php
declare(ticks=1);
//declare(ticks=4);
// A function called on each tick event
function tick_handler()
{
echo "tick_handler() called\n";
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
declare(encoding='ISO-8859-1');
```
-
return
return看似很簡(jiǎn)單,但就是因?yàn)楹?jiǎn)單,而導(dǎo)致有一些混亂,專業(yè)的phper需要搞清楚return的本質(zhì):
return是一個(gè)語(yǔ)言結(jié)構(gòu),默認(rèn)返回值而不是返回變量,如果需要返回變量,需要通過引用。參考函數(shù)/方法引用傳參,或函數(shù)返回一個(gè)引用的語(yǔ)法,參見函數(shù)章節(jié)的返回值。
return后面的參數(shù)不需要的用括號(hào),也不應(yīng)該用,可以減輕php的負(fù)擔(dān)。
- 如果在全局范圍中調(diào)用,則當(dāng)前腳本文件中止運(yùn)行。
- 如果當(dāng)前腳本文件是被 include 的或者 require 的,則控制交回調(diào)用文件。
- 如果當(dāng)前腳本是被 include 的,則 return 的值會(huì)被當(dāng)作 include 調(diào)用的返回值。
- 如果在主腳本文件中調(diào)用 return,則腳本中止運(yùn)行。
- 如果當(dāng)前腳本文件是在 php.ini 中的配置選項(xiàng) auto_prepend_file 或者 auto_append_file 所指定的,則此腳本文件中止運(yùn)行。
- return并不終止后續(xù)函數(shù)、類、方法的定義,也就是說在return之前可以調(diào)用在return代碼之后的函數(shù)方法塊。
-
require與include
require 和 include 幾乎完全一樣,除了處理失敗的方式不同之外。require 在出錯(cuò)時(shí)產(chǎn)生 E_COMPILE_ERROR 級(jí)別的錯(cuò)誤。
換句話說將導(dǎo)致腳本中止而 include 只產(chǎn)生警告(E_WARNING),腳本會(huì)繼續(xù)運(yùn)行。
include_once 語(yǔ)句在腳本執(zhí)行期間包含并運(yùn)行指定文件。與 include 語(yǔ)句類似,唯一區(qū)別是如果該文件已經(jīng)被包含過,則不會(huì)再次包含,只會(huì)包含一次。同require_once;
-
goto
在學(xué)c語(yǔ)言時(shí),都會(huì)被告知不提倡使用goto操作符。
PHP 中的 goto 有一定限制,目標(biāo)位置只能位于同一個(gè)文件和作用域,也就是說無法跳出一個(gè)函數(shù)或類方法,也無法跳入到另一個(gè)函數(shù)。也無法跳入到任何循環(huán)或者 switch 結(jié)構(gòu)中。可以跳出循環(huán)或者 switch,通常的用法是用 goto 代替多層的 break。
在php中,我們建議使用場(chǎng)景:
- 從多重循環(huán)中直接跳出 ;
- 出錯(cuò)時(shí)清除資源;
- 可增加程序的清晰度的情況;
建議:小范圍內(nèi)使用,不要神出鬼沒。還是可以使用的,特別是在模塊化做的比較好的項(xiàng)目中。