語言參考
1. 類型
1.1 簡介
1.2 Float 浮點型
浮點數的精度有限例如,floor((0.1+0.7) * 10) 通常會返回 7 而不是預期中的 8,因爲該結果內部的表示其實是類似 7.9999999999999991118...
1.3 String 字符串
string 最大可以達到 2GB
一個字符串可以用 4 種方式表達
- 單引號
- 雙引號
- heredoc 語法結構
- nowdoc 語法結構
1.4 Array 數組
PHP 中的數組實際上是一個有序映射。映射是一種把 values 關聯到 keys 的類型。此類型在很多方面做了優化,因此可以把它當成真正的數組,或列表(向量),散列表(是映射的一種實現),字典,集合,棧,隊列以及更多可能性。由於數組元素的值也可以是另一個數組,樹形結構和多維數組也是允許的
1.5 Resource 資源類型
資源 resource 是一種特殊變量,保存了到外部資源的一個引用。資源是通過專門的函數來建立和使用的
- 釋放資源
引用計數系統是 Zend 引擎的一部分,可以自動檢測到一個資源不再被引用了(和 Java 一樣)。這種情況下此資源使用的所有外部資源都會被垃圾回收系統釋放。因此,很少需要手工釋放內存
1.6 NULL
特殊的 NULL 值表示一個變量沒有值。NULL 類型唯一可能的值就是 NULL。
在下列情況下一個變量被認爲是 NULL
- 被賦值爲 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 也可用於確定一個變量是不是實現了某個接口的對象的實例
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 實現了一種代碼複用的方法,稱爲 traitTrait 是爲類似 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、安全、設計模式、架構、自我介紹、離職原因、職業規劃、準備問題等部分。