PHP

**PHP**（全稱：**P**HP：**H**ypertext **P**reprocessor，即「PHP：超文字預處理器」）是一種開源的通用電腦手稿語言，尤其適用於網路開發並可嵌入 HTML 中使用。PHP 的語法借鑑吸收 C 語言、Java 和 Perl 等流行電腦語言的特點，易於一般程式設計師學習。PHP 的主要目標是允許網路開發人員快速編寫動態頁面，但 PHP 也被用於其他很多領域。

PHP 最初是由勒多夫在 1995 年開始開發的；現在 PHP 的標準由 the PHP Group 維護。PHP 以 PHP License 作為許可協定，不過因為這個協定限制了 PHP 名稱的使用，所以和開放原始碼許可協定 GPL 不相容。

PHP 的應用範圍相當廣泛，尤其是在網頁程式的開發上。一般來說 PHP 大多執行在網頁伺服器上，通過執行 PHP 程式碼來產生使用者瀏覽的網頁。PHP 可以在多數的伺服器和作業系統上執行。根據 2013 年 4 月的統計資料，PHP 已經被安裝在超過 2 億 4400 萬個網站和 210 萬台伺服器上。

PHP 在 Windows 上有專門的官方移植編譯專案，並且分多個 VC 編譯器版本和執行緒安全特性來提供不同的版本支援。

根據 W3Techs 的報告，截至 2021 年 9 月：「有 78.9% 的網站使用 PHP。」

## 開發歷史

_PHP_ 原本的簡稱為 Personal Home Page，是拉斯姆斯・勒多夫為了要維護個人網頁，而用 C 語言開發的一些 CGI 工具程式集，來取代原先使用的 Perl 程式。最初這些工具程式用來顯示拉斯姆斯・勒多夫的個人履歷，以及統計網頁流量。他將這些程式和一些表單直譯器整合起來，稱為 PHP/FI。PHP/FI 可以和資料庫連接，產生簡單的動態網頁程式。拉斯姆斯・勒多夫在 1995 年 6 月 8 日將 PHP/FI 公開釋出，希望可以透過社群來加速程式開發與尋找錯誤。這個釋出的版本命名為 PHP 2，已經有今日 PHP 的一些雛型，像是類似 Perl 的變數命名方式、表單處理功能、以及嵌入到 HTML 中執行的能力。程式語法上也類似 Perl，有較多的限制，不過更簡單、更有彈性。

在 1997 年，任職於 Technion IIT 公司的兩個以色列程式設計師：Zeev Suraski 和 Andi Gutmans，重寫了 PHP 的剖析器，成為 PHP 3 的基礎，而 PHP 也在這個時候改稱為 _PHP: Hypertext Preprocessor_.。經過幾個月測試，開發團隊在 1997 年 11 月釋出了 PHP/FI 2，隨後就開始 PHP 3 的開放測試，最後在 1998 年 6 月正式釋出 PHP 3。Zeev Suraski 和 Andi Gutmans 在 PHP 3 釋出後開始改寫 PHP 的核心，這個在 1999 年釋出的剖析器稱為 Zend Engine，他們也在以色列的 Ramat Gan 成立了 Zend Technologies 來管理 PHP 的開發。

在 2000 年 5 月 22 日，以 Zend Engine 1.0 為基礎的 PHP 4 正式釋出，2004 年 7 月 13 日則釋出了 PHP 5，PHP 5 則使用了第二代的 Zend Engine。PHP 5 包含了許多新特色，像是強化的物件導向功能、引入 PDO（PHP Data Objects，一個存取資料庫的延伸函式庫）、以及許多效能上的增強。目前 PHP 4 已經不會繼續更新，以鼓勵使用者轉移到 PHP 5。

2008 年時，PHP 5 成為了 PHP 唯一維護中的穩定版本。

PHP 7 的首個版本於 2015 年 12 月 3 日開發完成，包含了大量效能上的改進，同時也帶來了一些新特性，最值得注意的是返回值類型聲明、純量類型聲明（可用於參數及返回值）。

### 版本歷程

## 吉祥物

PHP 計畫的吉祥物名叫「elePHPant」，PHP 的 logo 在一頭藍象的裡面，由文森・龐蒂爾 (Vincent Pontier) 在 1998 年設計。其設計概念是從側面看 PHP 像隻大象。當 elePHPant 被製作成毛絨玩具時，有時顏色會有不同。

## 應用

PHP 是一個應用範圍很廣的語言，特別是在網路程式開發方面。一般來說 PHP 大多在伺服器端執行，透過執行 PHP 的程式碼來產生網頁提供瀏覽器讀取，此外也可以用來開發命令列指令碼程式和使用者端的 GUI 應用程式。PHP 可以在許多的不同種的伺服器、作業系統、平台上執行，也可以和許多資料庫系統結合。使用 PHP 不需要任何費用，官方組織 PHP Group 提供了完整的程式原始碼，允許使用者修改、編譯、擴充來使用。

## 安全

據 National Vulnerability Database 資料顯示，與 PHP 有關的資料庫攻擊比例為：20% 2004, 28% 2005, 43% 2006, 36% 2007, 35% 2008 and 32% 2009。其中很多的漏洞都可以通過遠端操作完成，如：駭客可以通過網路連接攻擊伺服器，達到盜取或毀壞資料，傳送垃圾郵件或進行分散式阻斷服務攻擊。但是隨著更多的關注，PHP 也變得越來越安全了。

### PHP 官網被駭入事件

2010 年 12 月 17 日，PHP 代碼「貢獻者名單」中被加入「Wolegequ Gelivable」字樣（中文含義「我勒個去 給力」），約半小時後被刪除。2011 年 3 月 19 日，PHP 官方釋出聲明指出，駭客可能是通過 wiki.php.net 作為入口攻擊了代碼系統。並且，官方已經檢查過自版本 5.3.5 以來釋出的代碼，並沒有發現惡意內容。但官方同時表示，尚未完全掌握駭客發動本次攻擊的具體細節。

## 語法

PHP 的語法參考了 Perl、C 語言，而且可以整合在 HTML 之中，以下是一個簡單的 Hello World 程式碼：

PHP 剖析引擎只剖析**<?php** 到**?>**之間的程式碼，而不包含在**<?php** 到**?>**之間的內容則會直接送出，所以可以用以下的方式來將 PHP 程式碼嵌入在 HTML 之中：

在 HTML 中嵌入 PHP 時，比如需要單獨輸出某個變數，除了正常採用 echo 方式外，也可以直接採用下列方式：

但是上述這種方式曾經引起爭議，有的人並不推薦這種方式的縮寫（其原因為：並不是所有伺服器都支援縮寫，但在後期之後此選項為預設開啟），也有人因為採用這種方法，造成與 XML 搞混的情況。

在判斷語句中的 HTML 代碼並不會被直接送出：

PHP 可以用三種註解的形式：C 與 C++ 所使用的「/\*...\*/」與「//」，和 Perl 的「#」。

### 類型

PHP 主要有八種基本資料類型，其中包括：

* 四種變數類型
  * 整數型（integer）
  * 浮點數型（float）
  * 布林型（boolean）
  * 字串（string）
* 兩種複合類型
  * 陣列（array）
  * 物件（object）
* 兩種特殊類型
  * NULL
  * 資源 （resource）

### 變數

PHP 中，變數以「$」後接變數名稱來表示。 變數名稱區分大小寫。

有效的變數名稱以字母或底線開頭，後接任意數目的字母、數字或底線，PHP 也支援使用多位元組文字作為變數名。

### 物件導向

PHP 從 PHP 3 開始有了基本的物件導向（Object oriented）的特性，但直到 PHP 5 將物件導向部份重新改寫之後，PHP 的物件導向功能才比較完善。現在 PHP 可以說是一個有完整物件導向功能的語言。

## PHP 相關資源

### PHP 架構

使用 PHP 架構可以更快更簡單的部署專案並提高開發效率，但學習使用這些架構需要付出額外的學習成本。

最流行的 PHP 架構包括：Symfony, Zend Framework, Laravel、Phalcon、CodeIgniter、Yii、ThinkPHP 等等。

### 函式庫

內建多樣化的函式是 PHP 主要的特點之一，這些開放程式碼的函式提供了各種不同的功能，例如檔案處理、FTP、字串處理、等等。這些函式的使用方法和 C 語言相近（例如 printf），這也是 PHP 廣為流行的原因之一。

除了內建的函式之外，PHP 也提供了很多延伸函式庫（extension），像是各種資料庫連接函式、資料壓縮函式、圖形處理等等。有些延伸函式庫需要從 PECL（PHP Extension Community Library）取得。

以下是 **PHP** 程式語言提供的函式庫列表

### 原始碼編碼和加速

PHP 原始碼是可以直接讀取的，即使放到伺服器上執行也是一樣。雖然讓 PHP 多了彈性，但相對的會造成安全危機和效能下降的問題。

透過 PHP 編碼器，可以保護 PHP 的原始碼不被讀取（對商業軟體來說特別有需求），也可以提昇執行的效能。有許多公司或團體開發 PHP 的編碼器，將 PHP 程式編譯成位元組碼（byte code），再透過伺服器上安裝對應的程式來執行 PHP 指令碼。

除了透過編碼器加速之外，PHP 還可以透過動態的快取機制來提昇速度，加速工具有商業版的，例如 Zend Platform，也有開放原始碼的加速軟體如 eAccelerator、APC、XCache。

### php 包管理器

Composer 是 php 社群用來管理依賴關係的工具，一般在 php 專案中通過 composer.json 聲明依賴的外部 php 庫，然後就可以使用 Composer 管理包依賴。

## PHP 編譯器

PHP 一直被當作直譯器使用。PHP 編譯器則將 PHP 從直譯器中分離，為加快運行和改善與以其他程式語言編寫部份的互通性，例如 Phalanger 將 PHP 編譯成通用中間語言和 Hiphop for PHP 把 PHP 原始碼編譯成 C++ 等。Facebook 因應其網站大量的使用者，整合了 HPHPc、HPHPi、HPHPd 以及 HHVM 這四種指令碼引擎，開發出 HipHop for PHP，以加強網站效能。

## 發展

### PHP 7

* 基於 PHPNG 專案（PHP Next-Gen），它能讓透明提升 PHP 程式效能，使 PHP7 的效能和 HHVM 相當
* JIT 引擎
* 抽象語法樹編譯 AST: Abstract Syntax Tree
* 非同步編程

## 彩蛋

PHP 含有多個彩蛋，可以透過在網域名稱的後面加上特殊字串顯示彩蛋。例如，`?=PHPE9568F36-D428-11d2-A769-00AA001ACF42` 則會出現 PHP 的 logo，PHP 版本的不同，logo 也會不同；不過該特性已經在 5.5 版本中被移除。

## 趣聞

PHP 程式語言的官方文件中曾寫過「PHP 是最好的 WEB 開發語言，那其他的語言如何呢？」，但是這句話被華語圈的程式設計師訛傳為「世界上最好的語言」並加以調侃。

## 註釋

## 參考文獻

### 參照

### 來源

**網頁**

* PHP 手冊（頁面存檔備份，存於網際網路檔案館）
* 函式參考（頁面存檔備份，存於網際網路檔案館）

## 外部連結

* 官方網站
* 開放式目錄計劃中和 PHP 相關的內容
* PHP wiki（頁面存檔備份，存於網際網路檔案館）
* PHP 參考手冊（頁面存檔備份，存於網際網路檔案館）
* CentOS 下安裝 PHP7（頁面存檔備份，存於網際網路檔案館）
* Rocky Linux 8 安裝多個 PHP 版本 （頁面存檔備份，存於網際網路檔案館）