PHP

脚本语言

PHP(全称:PHP: Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收C语言JavaPerl等流行计算机语言的特点,易于一般程序员学习。PHP的主要目标是允许网络开发人员快速编写动态页面,但PHP也被用于其他很多领域。[3]

PHP
PHP-logo.svg
编程范型物件導向指令式編程
設計者拉斯姆斯·勒多夫
實作者The PHP Group
发行时间1995年,​28年前​(1995[1]
目前版本
  • 8.2.7 (2023年6月8日;穩定版本)[2]
編輯維基數據鏈接
型態系統動態、弱型別
操作系统跨平台
許可證PHP许可证
網站www.php.net 編輯維基數據鏈接
啟發語言
PerlHTMLCC++JavaJavaScriptHack
影響語言
HackJSPASP

PHP最初是由勒多夫在1995年开始开发的;現在PHP的標準由the PHP Group[4]維護。PHP以PHP License作為許可協議,不過因為這個協議限制了PHP名稱的使用,所以和開放原始碼許可協議GPL不相容。[5]

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

PHP在Windows上有专门的官方移植编译项目,并且分多个VC编译器版本和线程安全特性来提供不同的版本支持。

根据W3Techs的报告,截至2021年9月:“有78.9%的网站使用PHP。”[7]

開發歷史编辑

 
Zend Technologies的創辦人之一 - Andi Gutmans
 
Zend Technologies的創辦人之一 - Zeev Suraski

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

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

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

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

PHP 7的首个版本于2015年12月3日開發完成,包含了大量性能上的改进,同时也带来了一些新特性,最值得注意的是返回值类型声明、标量类型声明(可用于参数及返回值)。

版本歷程编辑

代表意義
紅色 过期版本;官方停止支援
黃色 当前版本;官方仅提供安全问题修复
綠色 当前版本;官方提供安全问题和一般问题的修复
藍色 未來版本
版本 釋出日期 结束支持日期[15] 說明
1.0 1995年6月8日 正式名稱為"Personal Home Page Tools (PHP Tools)",第一次使用了"PHP"的名字。[9]
2.0 1996年4月16日 針對PHP 1.0的改進版,速度更快、體積更小,更容易產生動態網頁。[9]
3.0 1998年6月6日 2000年10月20日 開發方式改成多人共同參與。Zeev Suraski和Andi Gutmans為了這個版本重寫了剖析引擎。[9]
4.0 2000年5月22日 2001年6月23日 改成以Zend引擎作為剖析器,具有兩階段剖析/標籤剖析系統等先進功能。[16]
4.1 2001年12月10日 2002年3月2日 加入"超全域變數"(superglobals)功能,包含了$_GET$_POST$_SESSION等。[16]
4.2 2002年4月22日 2002年9月6日 預設取消register_globals功能。從網路接收的資料將不會設定成全域變數,增加程式安全性。[16]
4.3 2002年12月27日 2005年3月31日 加入命令列執行檔,稱為CLI,用以补充CGI[16][17]
4.4 2005年7月11日 2008年8月8日 新增phpizephp-config 的手冊頁。[16]
5.0 2004年7月13日 2005年9月5日 推出有着新的对象模型的Zend Engine II。[18]
5.1 2005年11月24日 2006年8月24日 在往重新设计的PHP引擎引入编译变量时做了性能提升。[18]添加了PHP数据对象(PDO)作为访问数据库的统一接口。[19]
5.2 2006年11月2日 2011年1月6日 預設開啟"過濾"的擴充功能。[18]原生的JSON支援。[20]
5.3 2009年6月30日[21] 2014年8月14日 支持命名空间;使用XMLReader和XMLWriter增强XML支持;支持SOAP ,[22]延迟静态绑定,跳转标签(有限的goto), 闭包,Native PHP archives。
5.4 2012年3月1日 2015年9月3日 支持Trait、简短数组表达式。移除了register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister(), magic_quotes以及session_is_registered()。加入了内建的Web服务器。[23]增强了性能,减小内存使用量。
5.5 2013年6月20日 2016年7月10日 支持generators,用于异常处理的finally ,将OpCache(基于 Zend Optimizer+)加入官方发布中。
5.6 2014年8月28日 2018年12月31日 支持常量标量表达式、可变参数函数、指数运算符,增加phpdbg SAPI、统一的默认字符集。[24]
6.x 未发布 不適用 取消掉的、从未正式发布的PHP版本。[25][26]
7.0 2015年12月3日[27] 2018年12月3日 Zend Engine 3 (性能提升[28]并在Windows上支持 64-bit 整数),统一的变量语法, 

基于抽象语法树编译过程。

7.1 2016年12月1日 2019年12月1日 void返回值类型,类常量可见性修饰符
7.2 2017年11月30日 2020年11月30日
7.3 2018年12月6日 2021年12月6日
7.4 2019年11月28日 2022年11月28日 属性添加限定类型、箭头函数、空合并运算符赋值、数组展开操作
8.0 2020年11月26日 2023年11月26日 JIT即时编译,增加命名参数,注解实现,构造器属性提升,联合类型,Match 表达式,Nullsafe 运算符,字符串与数字的比较更符合逻辑,内部函数类型错误的一致性。
8.1 2021年11月25日 2024年11月25日
8.2 2022年12月8日 2025年12月8日
8.3 2023年11月23日 2026年11月23日

吉祥物编辑

 
吉祥物:elePHPant

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

應用编辑

 
網路應用開發

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

安全编辑

National Vulnerability Database数据显示,与PHP有关的数据库攻击比例为:20% 2004, 28% 2005, 43% 2006, 36% 2007, 35% 2008 and 32% 2009[33]。其中很多的漏洞都可以通过远程操作完成,如:黑客可以通过网络连接攻击服务器,达到盗取或毁坏数据,发送垃圾邮件或进行分散式阻斷服務攻擊。但是随着更多的关注,PHP也变得越来越安全了。

PHP官网被駭入事件编辑

2010年12月17日,PHP代码“贡献者名单”中被加入“Wolegequ Gelivable”字样(中文含义“我勒个去 给力”),约半小时后被删除。[34][35][36]2011年3月19日,PHP官方发布声明[37]指出,黑客可能是通过wiki.php.net作为入口攻击了代码系统。并且,官方已经检查过自版本5.3.5以来釋出的代码,并没有发现恶意内容。但官方同时表示,尚未完全掌握黑客发动本次攻击的具体细节。

語法编辑

PHP的語法參考了PerlC語言,而且可以整合在HTML之中,以下是一個簡單的Hello World程式碼:

 <?= 'Hello World!'; ?>

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

 <?php
     //-PHP-{zh-hans:代码;zh-hant:程式碼:}-
 ?>
 html內容
 <?php
     //-PHP-{zh-hans:代码;zh-hant:程式碼:}-
 ?>

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

 <?=$title?>

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

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

 <?php
 if (false) {
 ?>
 HTML Code
 <?php
 }
 ?>

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

 <?php
 /* 多行註解的第一行
 多行註解的另一行 */

 // 單行註解

 # 單行註解
 ?>

類型编辑

PHP主要有八种基本数据类型[40],其中包括:

變數编辑

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

有效的變數名稱以字母或底線開頭,後接任意數目的字母、數字或底線,PHP也支持使用多字节文字作为變數名。[41]

物件導向编辑

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

PHP相關資源编辑

PHP框架编辑

使用PHP框架可以更快更简单的部署项目並提高开发效率,但学习使用这些框架需要付出额外的学习成本。

最流行的PHP框架包括:Symfony, Zend Framework, LaravelPhalconCodeIgniterYiiThinkPHP等等。

函式庫编辑

內建多樣化的函數是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,也有開放原始碼的加速軟體eAcceleratorAPCXCache

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版本中被移除[42]

趣聞编辑

PHP程式語言的官方文档中曾写过「PHP是最好的WEB开发語言,那其他的语言如何呢?」[43],但是这句话被華語圈的程式設計師讹传为「世界上最好的语言」并加以调侃[來源請求]

註釋编辑

參考文獻编辑

引用编辑

  1. ^ Lerdorf, Rasmus. PHP on Hormones – history of PHP presentation by Rasmus Lerdorf given at the MySQL Conference in Santa Clara, California. The Conversations Network. 2007-04-26 [2009-12-11]. (原始内容存档于2019-01-06). 
  2. ^ 2.0 2.1 Version 8.2.7. 2023年6月8日 [2023年6月9日]. 
  3. ^ PHP:序言. [2013-05-13]. (原始内容存档于2013-08-06). 
  4. ^ the PHP Group. [2015-07-24]. (原始内容存档于2015-07-24). 
  5. ^ GPL-Incompatible, Free Software Licenses. Various Licenses and Comments about Them. Free Software Foundation. [2008-02-22]. (原始内容存档于2008-12-16). 
  6. ^ Usage Stats for April 2007. [2015-02-26]. (原始内容存档于2015-03-01). 
  7. ^ Usage statistics of PHP for websites. W3Techs - World Wide Web Technology Surveys. [2021-09-05]. 
  8. ^ php.net/history. [2018-08-12]. (原始内容存档于2018-08-16). 
  9. ^ 9.0 9.1 9.2 9.3 9.4 9.5 9.6 9.7 History of PHP and related projects. The PHP Group. [2008-02-25]. (原始内容存档于2008-07-08). 
  10. ^ Lerdorf, Rasmus. Announce: Personal Home Page Tools (PHP Tools). Newsgroupcomp.infosystems.www.authoring.cgi. 1995-06-08 [2006-09-17]. (原始内容存档于2006-09-03). 
  11. ^ Zend Engine version 2.0: Feature Overview and Design. Zend Technologies Ltd. [2006-09-17]. (原始内容存档于2006-07-19). 
  12. ^ Trachtenberg, Adam. Why PHP 5 Rocks!. O'Reilly. 2004-07-15 [2008-02-22]. (原始内容存档于2016-03-31). 
  13. ^ php.net 2007 news archive. The PHP Group. 2007-07-13 [2008-02-22]. (原始内容存档于2019-04-07). 
  14. ^ Kerner, Sean Michael. PHP 4 is Dead—Long Live PHP 5. InternetNews. 2008-02-01 [2008-03-16]. (原始内容存档于2016-03-24). 
  15. ^ PHP: Unsupported Branches. php.net. [2016-06-17]. (原始内容存档于2019-05-15). 
  16. ^ 16.0 16.1 16.2 16.3 16.4 PHP: PHP 4 ChangeLog. The PHP Group. 2008-01-03 [2008-02-22]. (原始内容存档于2008-02-28). 
  17. ^ PHP: Command line usage - Manual. php.net. [2016-06-17]. (原始内容存档于2016-06-26). 
  18. ^ 18.0 18.1 18.2 PHP: PHP 5 ChangeLog. The PHP Group. 2007-11-08 [2008-02-22]. (原始内容存档于2008-02-27). 
  19. ^ PHP: Introduction - Manual. php.net. [2016-06-17]. (原始内容存档于2016-07-03). 
  20. ^ PHP: PHP 5 ChangeLog. www.php.net. [2016-06-17]. (原始内容存档于2016-06-17). 
  21. ^ 存档副本. [2018-08-12]. (原始内容存档于2018-08-11). 
  22. ^ Zend Weekly Summaries Issue #359. [2008-12-16]. (原始内容存档于2009-01-03). 
  23. ^ Built-in web server. [2012-03-26]. (原始内容存档于2012-03-20). 
  24. ^ PHP: PHP 5 Changelog. [2018-08-12]. (原始内容存档于2018-08-13). 
  25. ^ Resetting PHP 6. [2015-07-24]. (原始内容存档于2015-07-24). There have been books on the shelves purporting to cover PHP 6 since at least 2008. But, in March 2010, the PHP 6 release is not out - in fact, it is not even close to out. Recent events suggest that PHP 6 will not be released before 2011 - if, indeed, it is released at all. 
  26. ^ PHP 7 moves full speed ahead. [2015-07-24]. (原始内容存档于2015-07-24). Recent versions of PHP have been part of the 5.x release series, but there will be no PHP 6. “We’re going to skip [version] 6 because years ago, we had plans for a 6 but those plans were very different from what we’re doing now,” Gutmans said. Going right to version 7 avoids confusion. 
  27. ^ PHP: todo:php70. 2015-05-27 [2015-06-01]. (原始内容存档于2015-06-21). 
  28. ^ PHP: phpng. wiki.php.net. [2016-06-17]. (原始内容存档于2016-06-16). 
  29. ^ PHP: ElePHPant. 2014-10-04 [2014-10-04]. (原始内容存档于2014-10-04). 
  30. ^ What is ElePHPant and Why PHP Uses Elephants in Some Logotypes?. [2017-09-30]. (原始内容存档于2017-02-14). 
  31. ^ The PHP Mascot's Birth - Creator Of The elePHPant Vincent Pontier Reveals The True Story!. [2018-08-13]. (原始内容存档于2018-08-13). 
  32. ^ Embedding PHP in HTML. O'Reilly. 2001-05-03 [2008-02-25]. (原始内容存档于2008-02-19). 
  33. ^ PHP-related vulnerabilities on the National Vulnerability Database. 2008-03-01 [2009-08-20]. (原始内容存档于2009-06-28). 
  34. ^ [1][失效連結]
  35. ^ PHP developer wiki server hacked. [2013-12-28]. (原始内容存档于2013-12-28). 
  36. ^ PHP官方网站被入侵,近期请勿从官方下载源码. [2013-12-28]. (原始内容存档于2013-12-28). 
  37. ^ 存档副本. [2018-08-12]. (原始内容存档于2018-08-13). 
  38. ^ [2]页面存档备份,存于互联网档案馆),Why are “echo” short tags permanently enabled as of PHP 5.4?
  39. ^ [3]页面存档备份,存于互联网档案馆),Escaping <? on php shorthand enabled server when using require
  40. ^ Types Introduction页面存档备份,存于互联网档案馆),The PHP Group
  41. ^ Language variables页面存档备份,存于互联网档案馆),The PHP Group
  42. ^ expose_php. [2018-08-12]. (原始内容存档于2018-08-13). 
  43. ^ 原文:PHP is the best language for web programing, but what about other languagesPHP: PHP and other languages - Manual. web.archive.org. 2010-05-07 [2019-02-21]. 原始内容存档于2010-05-07. 

来源编辑

网页

外部連結编辑