1. 程式人生 > >PHP 基礎總結

PHP 基礎總結

PHP(Hypertext Preprocessor)是一種被廣泛應用的開源通用指令碼語言,尤其適用於Web開發。可用於服務端指令碼、命令列指令碼、桌面應用程式三大領域。

PHP 的 SAPI(伺服器應用程式程式設計介面)提供了一個和外部通訊的介面,有點類似於socket,使得PHP可以和其他應用進行互動資料。常見有用於 Apache 的 php5_module、 nginx 的 CGI 、IIS 的 ISAPI、還有 Shell 的 CLI。

CGI(Common Gateway Interface):通用閘道器介面,它描述了 Web 伺服器和請求處理程式(如 PHP)之間資料傳輸的一個標準協議。請求處理程式也被叫做CGI程式。

FastCGI(Fast Common Gateway Interface):CGI 協議的增強版本,雖然 CGI 協議已經解決了 Web 伺服器與 CGI 程式間的通訊的問題。可是每一次 Web 請求都會先 fork 出 CGI 程式程序,處理完後結束程序,這種 fork-and-execute 模式非常浪費資源。

PHP-CGI: PHP 官方自帶的 FastCGI 管理器。雖然是php官方出品,但是效能太差,而且也很麻煩不人性化,修改 php.ini 配置後需要重啟才能生效,無法平滑重啟。

FPM(FastCGI Process Manager FastCGI 程序管理器):用於替換 PHP FastCGI 的大部分附加功能,對於高負載網站是非常有用的。支援平滑停止/啟動的高階程序管理功能。

PHP 支援資料型別
標量型別(4): boolean、integer、 float(double)、string
複合型別(3): array、object、callable(可呼叫)
特殊型別(2):resource(資源) NULL(無型別)

偽型別(pseudo-types) :是在 PHP 文件裡為了確保程式碼的易讀性,用於指示引數可以使用的型別和值。

總結:
1、字串有四種表示法:單引號、雙引號、heredoc、nowdoc。string 最大可以達到 2GB
1、任何資源和 NAN 都是TRUE,空標記生成的 SimpleXML 物件為FALSE。
2、精度丟失問題用BCMath(任意精度數學庫 )


2、陣列的鍵名只能是整型或字串,布林值、浮點數、合法的數字字串都會強轉為整型。NULL轉為空字串。
3、其它型別被轉換成物件,會建立一個內建類 stdClass 物件例項。
5、資源型別的變數儲存了到外部資源的一個引用,它是通過函式來建立和使用的。垃圾回收系統會自動釋放無用資源,但持久資料庫連線比較特殊。
9、尚未被賦值和被 unset() 的變數都值為 NULL


變數:用美元符號後面跟變數名來表示一個變數,變數名區分大小寫。

靜態變數:僅在函式作用域中存在,當程式執行離開此作用域時,其值並不丟失。

可變變數:一個變數的變數值卻是另一個變數的變數名。如:$a='b'; $$a='bbb'; echo $b;

預定義變數:系統內建變數,PHP會自動將所有的外部變量表示成內建環境變數。
超全域性變數
$php_errormsg :前一個錯誤資訊
$HTTP_RAW_POST_DATA : 原生POST資料
$http_response_header :HTTP 響應頭
$argc : 傳遞給指令碼的引數數目
$argv : 傳遞給指令碼的引數陣列

超全域性變數:在全部作用域中始終可用的內建變數。
$GLOBALS : 引用全域性作用域中可用的全部變數
$_SERVER : 伺服器和執行環境資訊
$_GET : HTTP GET 變數
$_POST : HTTP POST 變數
$_FILES : HTTP 檔案上傳變數
$_REQUEST : HTTP Request 變數
$_SESSION : Session 變數
$_ENV : 環境變數
$_COOKIE :HTTP Cookies

常量: 值不變的量。一旦定義就不能取消和修改,常量的值只能是標量。

魔術常量:__LINE__、__FILE__、__NAMESPACE__、__DIR__、__FUNCTION__、__CLASS__、__METHOD__、__TRAIT__ (都不區分大小寫)

表示式: 任何有值的東西。

運算子:可以通過給出的一或多個值來產生另一個值的符號。

遞增/遞減運算子:遞增/遞減操作不會影響布林值。NULL 值遞增為 1,遞減無效。

錯誤控制運算子:將 @ 放置在一個 PHP 表示式之前,表示忽略表示式執行的錯誤資訊。

執行運算子:反引號(``)會將其中的內容作為 shell 命令來執行。反引號不能在雙引號字串中使用。

字串運算子:"." 和 ".=" 用於字串拼接。

陣列相加:陣列相加不會覆蓋;數組合並(array_merge),字串鍵名會覆蓋,數字鍵名則不會。

可變函式:當把變數寫成函式呼叫形式時,PHP 將嘗試執行與變數值同名的函式。

匿名函式(Anonymous functions):允許臨時建立一個沒有指定名稱的函式,常用作回撥。是通過 Closure 類來實現的。

類常量:在類內部定義為常量。

類的自動載入:通過 spl_autoload_register() 函式註冊自動載入器,當使用尚未被定義的類和介面時,會自動載入檔案。 注意, __autoload() 函式也能實現,但它以後的版本可能被棄用。

範圍解析操作符: 一對冒號(::)用於訪問靜態成員,類常量。

Trait:實現了一種程式碼複用的方法,彌補了單繼承的不足。

匿名類:PHP 7 開始支援匿名類,它可以建立一次性的簡單物件。

過載:過載一般是指,定義多個引數型別或者個數不同,的同名方法。PHP 所提供的過載是通過魔術方法動態地建立類屬性和方法。

遍歷物件:物件的所有可見屬性,才能夠被用於遍歷為,屬性變數名與屬性值的鍵值對。

魔術方法:一些能夠在特殊情況下,被自動呼叫方法被稱為魔術方法,如果你想實現相應的魔術功能,可以定義具體實現。

__construct():構造方法
__destruct():析構方法
__call():呼叫不存在的動態方法
__callStatic():呼叫不存在的靜態方法
__get():獲取不存在的屬性
__set(): 屬性賦值
__isset(): isset()
__unset():unset()
__sleep() :serialize()
__wakeup() : unserialize()
__toString(): 列印物件
__invoke(): 以函式的方式呼叫物件
__set_state() :var_export() 匯出類
__clone():使用clone 關鍵字複製物件時,會對物件的所有屬性執行一個淺複製。
__debugInfo():var_dump()

型別約束:指定函式的引數限制。必須為物件,介面,陣列,或者 callable型別。

物件和引用:預設情況下物件是通過引用傳遞的,但這又不完全正確。但是官方解釋,我沒看懂。

序列化:使用函式serialize()來返回一個包含位元組流的字串來表示。

序列化物件:序列化一個物件將只會儲存類的名字和物件所以變數,不會儲存方法。

名稱空間:名稱空間是一種封裝類的方法,用於防止類名衝突。

錯誤處理:PHP7 以後,大多數異常被作為 Error 異常丟擲,Error 並非繼承自 Exception 類。未被處理的 Error 異常,被報告為一個致命錯誤(Fatal Error)

異常處理:異常可以被try/catch 塊所捕獲,如果未捕獲,則呼叫異常處理函式(事先通過 set_exception_handler() 註冊)進行處理。在PHP 5.5後才能用 finally。

生成器:提供了一種更容易的方法來實現簡單的物件迭代,相比於實現 Iterator 介面的方式,效能開銷和複雜性大大降低。它還允許你在 foreach 程式碼塊中寫程式碼來迭代返回值。

生成器語法:在函式內部使用 yield 關鍵字,來生成許多它所需要返回的值。

引用:用不同的名字訪問同一個變數內容。引用不是指標。

預定義異常:Exception 和 ErrorException 兩個異常類。

預定義介面:
Traversable(遍歷)介面
Iterator(迭代器)介面
IteratorAggregate(聚合式迭代器)介面
ArrayAccess(陣列式訪問)介面
Serializable 序列化介面
Closure 匿名函式類
Generator 生成器類

垃圾回收機制:每個php變數存在一個叫 "zval" 的變數容器中。一個zval變數容器,除了包含變數的型別和值,還包括兩個位元組的額外資訊。is_ref 用來標識這個變數是否是屬於引用集合,refcount 表示指向這個zval變數容器的變數個數,這被稱作引用計數。當指向變數容器的,變數個數為0時,就會在下一個垃圾回收週期時,被標記為垃圾。一旦根緩衝區滿了或者手動呼叫 gc_collect_cycles() 函式時,就會執行垃圾回收。