重讀PHP手冊筆記系列(二)

語言參考

1. 類型

1.1 簡介

數據類型

僞類型

1.2 Float 浮點型

浮點數的精度有限

例如,floor((0.1+0.7) * 10) 一般會返回 7 而不是預期中的 8,由於該結果內部的表示實際上是相似 7.9999999999999991118...php

1.3 String 字符串

string 最大能夠達到 2GB

一個字符串能夠用 4 種方式表達git

  • 單引號
  • 雙引號
  • heredoc 語法結構
  • nowdoc 語法結構

1.4 Array 數組

PHP 中的數組其實是一個有序映射。映射是一種把 values 關聯到 keys 的類型。此類型在不少方面作了優化,所以能夠把它當成真正的數組,或列表(向量),散列表(是映射的一種實現),字典,集合,棧,隊列以及更多可能性。因爲數組元素的值也能夠是另外一個數組,樹形結構和多維數組也是容許的

1.5 Resource 資源類型

資源 resource 是一種特殊變量,保存了到外部資源的一個引用。資源是經過專門的函數來創建和使用的
  • 釋放資源
引用計數系統是 Zend 引擎的一部分,能夠自動檢測到一個資源再也不被引用了(和 Java 同樣)。這種狀況下此資源使用的全部外部資源都會被垃圾回收系統釋放。所以,不多須要手工釋放內存

1.6 NULL

特殊的 NULL 值表示一個變量沒有值。NULL 類型惟一可能的值就是 NULL。

在下列狀況下一個變量被認爲是 NULLgithub

  • 被賦值爲 NULL
  • 還沒有被賦值
  • 被 unset()

1.7 僞類型

僞類型(pseudo-types) 是 PHP 文檔裏用於指示參數可使用的類型和值。 請注意,它們不是 PHP 語言裏原生類型。 因此不能把僞類型用於自定義函數裏的類型約束(typehint)

2. 變量

2.1 變量範圍

變量的範圍即它定義的上下文背景(也就是它的生效範圍)。大部分的 PHP 變量只有一個單獨的範圍。這個單獨的範圍跨度一樣包含了 include 和 require 引入的文件

這裏變量 $a 將會在包含文件 b.inc 中生效。可是,在用戶自定義函數中,一個局部函數範圍將被引入。任何用於函數內部的變量按缺省狀況將被限制在局部函數範圍內面試

2.2 可變變量

$a = 'hello';
$$a = 'world';
echo "$a ${$a}";

3. 常量

3.1 魔術常量

名稱 說明
__LINE__ 文件中的當前行號
__FILE__ 文件的完整路徑和文件號
__DIR__ 文件所在的目錄
__FUNCTION__ 函數名稱
__CLASS__ 類的名稱
__TRAIT__ Trait的名字
__METHOD__ 類的方法名
__NAMESPACE__ 當前命名空間的名稱(區分大小寫)

4.運算符

4.1 算術運算符

//乘方
$a = 3;
$b = 2;
echo $a ** $b;

4.2 位運算符

位運算符容許對整型數中指定的位進行求值和操做
例子 名稱 結果
$a & $b And(按位與) 將把 $a 和 $b 中都爲 1 的位設爲 1
$a 豎線(注1) $b Or(按位或) 將把 $a 和 $b 中任何一個爲 1 的位設爲 1
$a ^ $b Xor(按位異或) 將把 $a 和 $b 中一個爲 1 另外一個爲 0 的位設爲 1
~ $a Not(按位取反) 將 $a 中爲 0 的位設爲 1,反之亦然
$a << $b Shift left(左移) 將 $a 中的位向左移動 $b 次(每一次移動都表示「乘以 2」)
$a >> $b Shift right(右移) 將 $a 中的位向右移動 $b 次(每一次移動都表示「除以 2」)
注1:這裏「豎線」豎線是「|」,這裏 markdown 支持好像有點問題

4.3 比較運算符

比較運算符,如同它們名稱所暗示的,容許對兩個值進行比較
例子 名稱 結果
$a == $b 等於 TRUE,若是類型轉換後 $a 等於 $b
$a === $b 全等 TRUE,若是 $a 等於 $b,而且它們的類型也相同
$a != $b 不等 TRUE,若是類型轉換後 $a 不等於 $b
$a <> $b 不等 TRUE,若是類型轉換後 $a 不等於 $b
$a !== $b 不全等 TRUE,若是 $a 不等於 $b,或者它們的類型不一樣
$a < $b 小與 TRUE,若是 $a 嚴格小於 $b
$a > $b 大於 TRUE,若是 $a 嚴格大於 $b
$a <= $b 小於等於 TRUE,若是 $a 小於或者等於 $b
$a >= $b 大於等於 TRUE,若是 $a 大於或者等於 $b
$a <=> $b 太空船運算符(組合比較符) 當$a小於、等於、大於$b時 分別返回一個小於、等於、大於0的integer 值。 PHP7開始提供.
$a ?? $b ?? $c NULL 合併操做符 從左往右第一個存在且不爲 NULL 的操做數。若是都沒有定義且不爲 NULL,則返回 NULL。PHP7開始提供

4.4 執行運算符

PHP 支持一個執行運算符:反引號(``)。注意這不是單引號!PHP 將嘗試將反引號中的內容做爲 shell 命令來執行,並將其輸出信息返回(即,能夠賦給一個變量而不是簡單地丟棄到標準輸出)。使用反引號運算符「`」的效果與函數 shell_exec() 相同

4.5 數組運算符

例子 名稱 結果
$a + $b 聯合 $a 和 $b 的聯合
$a == $b 相等 若是 $a 和 $b 具備相同的鍵/值對則爲 TRUE
$a === $b 全等 若是 $a 和 $b 具備相同的鍵/值對而且順序和類型都相同則爲 TRUE
$a != $b 不等 若是 $a 不等於 $b 則爲 TRUE
$a <> $b 不等 若是 $a 不等於 $b 則爲 TRUE
$a !== $b 不全等 若是 $a 不全等於 $b 則爲 TRUE

4.6 類型運算符

instanceof 用於肯定一個 PHP 變量是否屬於某一類 class 的實例

instanceof 也可用來肯定一個變量是否是繼承自某一父類的子類的實例算法

instanceof 也可用於肯定一個變量是否是實現了某個接口的對象的實例shell

5. 流程控制

5.1 流程控制的替代語法

PHP 提供了一些流程控制的替代語法,包括 if,while,for,foreach 和 switch。替代語法的基本形式是把左花括號({)換成冒號(:),把右花括號(})分別換成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;
if (true) :
    echo "run\n";
endif;

5.2 do-while

5.3 break

break 結束當前 for,foreach,while,do-while 或者 switch 結構的執行

break 能夠接受一個可選的數字參數來決定跳出幾重循環編程

5.4 continue

continue 在循環結構用用來跳過本次循環中剩餘的代碼並在條件求值爲真時開始執行下一次循環

continue 接受一個可選的數字參數來決定跳過幾重循環到循環結尾。默認值是 1,即跳到當前循環末尾設計模式

5.5 declare

declare 結構用來設定一段代碼的執行指令
declare(ticks=1);

// 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);
}

5.6 require

require 和 include 幾乎徹底同樣,除了處理失敗的方式不一樣以外。require 在出錯時產生 E_COMPILE_ERROR 級別的錯誤。換句話說將致使腳本停止而 include 只產生警告(E_WARNING),腳本會繼續運行

6. 函數

6.1 用戶自定義函數

當一個函數是有條件被定義時,必須在調用函數以前定義

PHP 不支持函數重載,也不可能取消定義或者重定義已聲明的函數數組

可是要避免遞歸函數/方法調用超過 100-200 層,由於可能會使堆棧崩潰從而使當前腳本終止。 無限遞歸可視爲編程錯誤安全

6.2 可變函數

PHP 支持可變函數的概念。這意味着若是一個變量名後有圓括號,PHP 將尋找與變量的值同名的函數,而且嘗試執行它。可變函數能夠用來實現包括回調函數,函數表在內的一些用途
function foo() {
    echo "In foo()<br />\n";
}

$func = 'foo';
$func();        // This calls foo()

6.3 匿名函數

匿名函數(Anonymous functions),也叫閉包函數(closures),容許 臨時建立一個沒有指定名稱的函數。最常常用做回調函數(callback)參數的值
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

$greet('World');
$greet('PHP');

7. 類與對象

7.1 基本概念

每一個類的定義都以關鍵字 class 開頭,後面跟着類名,後面跟着一對花括號,裏面包含有類的屬性與方法的定義

一個類能夠包含有屬於本身的常量,變量(稱爲「屬性」)以及函數(稱爲「方法」)

當一個方法在類定義內部被調用時,有一個可用的僞變量 $this

7.2 類的自動加載

在編寫面向對象(OOP) 程序時,不少開發者爲每一個類新建一個 PHP 文件。 這會帶來一個煩惱:每一個腳本的開頭,都須要包含(include)一個長長的列表(每一個類都有個文件)

在 PHP 5 中,已經再也不須要這樣了。 spl_autoload_register() 函數能夠註冊任意數量的自動加載器,當使用還沒有被定義的類(class)和接口(interface)時自動去加載。經過註冊自動加載器,腳本引擎在 PHP 出錯失敗前有了最後一個機會加載所需的類

spl_autoload_register(function ($class_name) {
    require_once $class_name . '.php';
});

$obj  = new MyClass1();
$obj2 = new MyClass2();

7.3 構造函數和析構函數

  • 構造函數
PHP 5 允行開發者在一個類中定義一個方法做爲構造函數。具備構造函數的類會在每次建立新對象時先調用此方法,因此很是適合在使用對象以前作一些初始化工做
  • 析構函數
PHP 5 引入了析構函數的概念,這相似於其它面向對象的語言,如 C++。析構函數會在到某個對象的全部引用都被刪除或者當對象被顯式銷燬時執行

7.4 抽象類

PHP 5 支持抽象類和抽象方法。定義爲抽象的類不能被實例化。任何一個類,若是它裏面至少有一個方法是被聲明爲抽象的,那麼這個類就必須被聲明爲抽象的。被定義爲抽象的方法只是聲明瞭其調用方式(參數),不能定義其具體的功能實現

7.5 對象接口

使用接口(interface),能夠指定某個類必須實現哪些方法,但不須要定義這些方法的具體內容

接口是經過 interface 關鍵字來定義的,就像定義一個標準的類同樣,但其中定義全部的方法都是空的

接口中定義的全部方法都必須是公有,這是接口的特性

  • 實現(implements)
要實現一個接口,使用 implements 操做符。類中必須實現接口中定義的全部方法,不然會報一個致命錯誤。類能夠實現多個接口,用逗號來分隔多個接口的名稱

7.6 Trait

自 PHP 5.4.0 起,PHP 實現了一種代碼複用的方法,稱爲 trait

Trait 是爲相似 PHP 的單繼承語言而準備的一種代碼複用機制。Trait 爲了減小單繼承語言的限制,使開發人員可以自由地在不一樣層次結構內獨立的類中複用 method。Trait 和 Class 組合的語義定義了一種減小複雜性的方式,避免傳統多繼承和 Mixin 類相關典型問題

Trait 和 Class 類似,但僅僅旨在用細粒度和一致的方式來組合功能。 沒法經過 trait 自身來實例化。它爲傳統繼承增長了水平特性的組合;也就是說,應用的幾個 Class 之間不須要繼承

7.7 匿名類

7.8 魔術方法

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() 等方法在 PHP 中被稱爲"魔術方法"(Magic methods)

7.9 Final 關鍵字

PHP 5 新增了一個 final 關鍵字。若是父類中的方法被聲明爲 final,則子類沒法覆蓋該方法。若是一個類被聲明爲 final,則不能被繼承

8. 生成器

9. 預約義變量

名稱 用途
超全局變量 超全局變量是在所有做用域中始終可用的內置變量
$GLOBALS 引用全局做用域中可用的所有變量
$_SERVER 服務器和執行環境信息
$_GET HTTP GET 變量
$_POST HTTP POST 變量
$_FILES HTTP 文件上傳變量
$_REQUEST HTTP Request 變量
$_SESSION Session 變量
$_ENV 環境變量
$_COOKIE HTTP Cookies
$php_errormsg 前一個錯誤信息
$HTTP_RAW_POST_DATA 原生POST數據
$http_response_header HTTP 響應頭
$argc 傳遞給腳本的參數數目
$argv 傳遞給腳本的參數數組

《PHP 面試問答》

結合實際 PHP 面試,系統的彙總面試中的各類各樣的問題,嘗試提供簡潔準確的答案。若是你在 PHP 面試中遇到問題,歡迎提 Issues 交流。包含網絡協議、數據結構與算法、PHP、Web、MySQL、Redis、Linux、安全、設計模式、架構、自我介紹、離職緣由、職業規劃、準備問題等部分。
相關文章
相關標籤/搜索