飛機的 PHP 學習筆記之語言基礎篇

飛機飛過天空發表於2020-01-14

前言

最近在系統的學習 PHP ,參考的資料是《PHP程式設計》(如果你有好的書籍歡迎推薦給我)。雖然這本書是基於 PHP5 的,但是我筆記裡的程式碼在 PHP7.2 裡是能跑的。另,學習筆記中只記錄我覺得很重要的知識,你可以對照一下看你是否全部瞭解。

大小寫

類、函式、內建的結構以及關鍵字等是不區分大小寫的。(PS:變數區分大小寫)

註釋

PHP 有多種註釋方式,這些方式都是借鑑現有的語言(C、C++、UNIX shell)

其中 shell 風格的註釋使用 # 來標識。

資料型別

PHP 提供八種型別的值或稱為資料型別。

  • 四種是標量型(單值)的:整形、浮點數(實數)、字串和布林型。

  • 兩種複合型別(集合):陣列和物件。

  • 剩下的兩種是特殊型別:資源和 NULL 。


  • 十六進位制以 0x 開頭,字母是可以大寫或小寫,但通常是大寫

  • 八進位制以 0 開頭。

  • 二進位制以 0b 開頭。

  • 變數在雙引號中會被解析(解釋),而在單引號中,他們不會被解析:

    $name = "Guido";
    echo "Hi, $name\n"; // Hi, Guido
    echo 'Hi, $name'; // Hi, $name
  • 在 PHP 中,以下值的計算結果為 false

    • 關鍵字 false
    • 整形 0
    • 浮點數 0.0
    • 空字串 "" 和字串 "0"
    • 空陣列
    • 空物件
    • NULL
  • 定義一個類,就可以用關鍵字 new 建立這個類的任意數量的物件,類的屬性和方法可以通過 -> 結構訪問。

變數的變數

$foo = "bar";
$$foo = "baz"; //變數bar的值為 

變數的引用

在PHP中,引用就是如何建立變數的別名。可以說兩個變數儲存了相同的值。

銷燬其中一個變數的值,不會影響另一個變數的值。

$bigLongVariableName = "PHP";
$short =& $bigLongVariableName;
$bigLongVariableName .= " rocks!";
print "\$short is $short\n"; // $short is PHP rocks!
print "Long is $bigLongVariableName\n"; // Long is PHP rocks!

$short = "Programing $short";
print "\$short is $short\n"; // $short is Programming PHP rocks!
print "Long is $bigLongVariableName\n"; // Long is Programming PHP rocks!

$white = "snow";
$black =& $white;
unset($white);
print $black; //snow

這裡的換行符可能在瀏覽器中顯示不出來,可以參考這篇:如何在 PHP 中換行,解決問題。

變數的作用域

在 PHP 中,只有函式可以提供區域性作用域。與其他語言不同,在 PHP 中不能建立一個作用域是迴圈、條件分支或其他塊型別的區域性變數。也就是說函式外宣告的變數就是全域性變數,他們可以在程式的任何部分被訪問。不過,預設情況下全域性變數在內部函式中是不可訪問的。

為了讓函式訪問全域性變數共有兩個方法:

方法一:使用 global 關鍵字

function updateCounter()
{
    global $counter;
    $counterr++;
}

$counter = 10;
updateCounter();
echo $counter; // 11

方法二:使用 PHP 中的 $GLOBALS 陣列

function updateCounter()
{
    $GLOBALS[counter]++:
}

$counter = 10;
updateCounter();
echo $counter; // 11

隱式轉換

當二元算數操作符是兩個不同的型別時 PHP 會根據需要自動轉換,其中的階梯為:字串 -> 整數 -> 浮點數。

假定一個字串以一個整數或浮點數開始。如果未在字串的開始處發現任何數字,該字串的數值為0。如果字串包含一個點( . )或大寫/小寫的 e ,對該字串的求值則生成一個浮點數。例如:

"9 Lives" - 1;            //8 (整數)
"3.14 Pies" * 2;          //6.28 (浮點數)
"9 Lives." -1;            //8 (整數)
"1E3 Points of Light" + 1 // 1001 (浮點型)

除法操作符

如果兩個數能整除,則為整數( 4/2 ),否則為浮點數( 1/2 )。

自動遞增操作符

在 PHP 中,對字串中使用自動遞增,會相應得到下一個字母。(我測試了一下,只對遞增操作符有效)

$a = "z";
echo  ++$a; // "aa"

垃圾收集

PHP 使用引用計數寫時複製來管理記憶體。

  • 寫時複製:保證了變數間複製值不浪費記憶體。
  • 引用計數:保證了不在需要時將記憶體釋放給作業系統。

操作符

錯誤遮蔽( @

一些操作符或者函式可能產生錯誤資訊,錯誤遮蔽操作符用來阻止這些資訊的產生。

執行( ` )

反引號操作符可以把反引號之間的字串當作shell命令執行,並返回輸出結果:

$listing = `ls`;
echo $listing; // 輸出檔案目錄

型別( instanceof

Instanceof 操作符用來測試一個變數是否為給定類的例項化物件,或者是一個介面的實現:

$a = new Foo;
$isAFoo = $a instanceof Foo; // ture
$isABar = $a instanceof Bar; // false

流程控制語句

新的寫法

PHP 支援很多傳統程式設計結構,用來控制程式執行的流程。與傳統的用一對大括號包括的寫法不同, PHP 還提供了另外一種語法。使用一個冒號(:)作為流程控制語句的結尾,並且以特定的關鍵字作為流程控制語句塊的結尾。

if ($user_balidated){
    echo "Welocome!";
    $greeted = 1;
}else{
    echo "Access Forbidden!";
    exit;
}
//等價於
if ($iser_ba;odated): // 這裡不一樣
    echo "Welcome!";
    $greeted = 1;
else: // //這裡不一樣
    echo "Access Forbidden!";
    exit;
endif; // 這裡不一樣

這裡僅展示 if 的寫法,其他語句與上面類似。

break 與 continue

PHP 中 breakcontinue 分別代表提前退出一個迴圈和跳到迴圈條件的下一次判斷。不同的是,可以在關鍵詞後面放一個數字,表示 break 要中斷多少層迴圈。以 break 為例:

$i = 0;
$j = 0;
while($i < 10){
    while($j < 10){
        if ($j == 5){
            break 2;
        }
        ++$j;
    }
    ++$i;
}
echo "{$i},{$j}"; // 0,5

break 類似,continue 也可以退出多個層次的迴圈。

declare

declare 語句允許指定的一段程式碼執行指令。目前只有兩種 declare 的方式:ticksencoding 指令

ticks

Tick(時間週期)是一個 declare 程式碼段中直譯器每執行 N 條可計時的低階語句就會發生的事件。不是所有語句都可以計時。通常條件表示式和參數列達式都不可計時。

在每個 tick 中出現的事件是由 register_tick_function() 來指定的。注意每個 tick 中可以出現多個事件。

declare(ticks=1); // 每執行一條語句時,tick_handler()就會被執行

// A function called on each tick event
function tick_handler()
{
  echo "tick_handler() called\n <br/>";
}

register_tick_function('tick_handler');

$a = 1;

if ($a > 0) {
  $a += 2;
  print($a);
}

encoding

使用 encoding 指令指定 PHP 指令碼輸出編碼的格式

declare(encoding = "UTF-8");

PS : 這種語句在編譯時要加上 --enable-zend-multibyte 的選項。否則沒有效果。

exit 和 return

指令碼執行到 exit 語句時,就會停止執行。

return 語句一般用於某個函式退出返回,或者指令碼停止執行。

die() 函式時 exit 語句的一個別名。

包含程式碼

PHP 提供兩種方式實現從另外的模組載入程式碼和 HTML 內容:requireinclude

  • require 載入一個不存在的檔案時,會產生一個致命的錯誤,進而指令碼停止執行
  • include 載入一個不存在的檔案時,會產生一個警告哦,不停止指令碼的執行
  • 如果你多次引用同一個檔案,但是你只想載入一次,可以使用 include_oncerequire_once

在 Web 頁面中巢狀 PHP

標準( XML )風格

<?php echo "Hello, world"; ?>

SGML 風格

<? echo "Hello, world"; ?>

這種形式被稱為短標籤,預設時關閉的。你可以在編譯時增加 -enable-short-tags 選項,或者在 PHP 配置檔案中開啟 short_open_tag

感謝你看到了這裡。如果文章有錯誤,請評論指正,謝謝!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章