PHP基礎(chǔ)參考02-基礎(chǔ)語(yǔ)法參考1

來源: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。

    字符串以及為什么說 PHP 不支持 Unicode_zhoucy-CSDN博客_php字符串unicode

- 語(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ì)象

    通俗易懂PHP迭代生成器 - 9ong

  • 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ù)來建立和使用的。

      PHP: 資源類型列表 - Manual

  • 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è)變量都被定義了:a 的內(nèi)容是“hello”并且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ū)分大小寫。

    PHP: 魔術(shù)常量 - Manual

表達(dá)式

PHP 是一種面向表達(dá)式的語(yǔ)言,從這一方面來講幾乎一切都是表達(dá)式。

PHP: 表達(dá)式 - Manual

沒有什么太多讓人意外的知識(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)算符 ** , a **b ,求a的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)目中。

來源:PHP基礎(chǔ)參考02-基礎(chǔ)語(yǔ)法參考1 - 9ong

PHP基礎(chǔ)參考03-基礎(chǔ)語(yǔ)法參考2 - 9ong

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,346評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,558評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,739評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,980評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評(píng)論 1 280
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,347評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,702評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容