PHP


PHP (正體)

PHP
编程范型: 物件导向、函数式
设计者: Rasmus Lerdorf
实作者: The PHP Group
最近释出日期: 5.2.6/ 2008年5月6日
型态系统: 动态、弱型别
启发语言: PerlCJava
作业系统: 跨平台
许可证: PHP License
网站: PHP 官方站点

PHPPHP:Hypertext Preprocessor)是一种电脑上的脚本语言,主要是设计成处理动态网页,用于服务器端脚本处理,不过也可以以命令列执行,或者产生独立的图形使用者接口程式。[1]

PHP最早由 Rasmus Lerdorf 在1995年发明,现在PHP的标准由PHP Group和社群维护。PHP 以 PHP License 作为许可协议,也是自由软件基金会所认可的自由软件[2]

PHP多数被用于服务器端脚本语言,是在服务器上执行PHP程式码,输出网页让使用者浏览的方式。PHP可以在许多的平台上执行,而且都是免费的。PHP已经被安装在超过2千万个网站、1百万台服务器上,不过这个统计数字自从2005年8月后就没有更新过了[3]。目前最新的PHP版本是5.2.6,在2008年5月6日释出[4]

目录

PHP 发展历史

Image:Lerdorf.jpg
PHP的发明者 Rasmus Lerdorf

PHP 原本称呼为 "Personal Home Page",是程式设计师 Rasmus Lerdorf 在1994年为了取代维护自己个人网页的Perl程式而发展出来的。最早 PHP 是一些CGI程式的集合,主要用来显示 Rasmus Lerdorf 个人网页上的履历和统计网站流量[5]。不久之后 Rasmus Lerdorf 扩充了这些CGI程式,加入了许多功能,并且改称做 PHP/FI。PHP/FI主要以C语言构成,并且可以连接数据库,并且显示简单的动态网页。在1995年6月8日,Rasmus Lerdorf 公布了PHP/FI,希望透过社群来增强PHP/FI的功能,并且帮忙除错.[6]。公布后的版本被称作为PHP 2,已经有现今PHP的一些基本功能,像是Perl形式的变量(变量前加上$,例如:$variable)、表单处理、和嵌入于HTML的功能。语法上类似Perl,但是限制比较多,也比较简单、有弹性。[5]

和Zeev Suraski一起改寫PHP 3解析引擎的Andi Gutmans
和Zeev Suraski一起改写PHP 3解析引擎的Andi Gutmans

1997年两个任职于Technion IIT公司的以色列程式设计师 Zeev Suraski 和 Andi Gutmans 改写了PHP的解析引擎,这个解析引擎成为了PHP 3的核心,PHP也改称做PHP: Hypertext Preprocessor[5]

PHP的开发团队在1997年11月释出了PHP/FI 2,随后开始进行 PHP 3的测试,PHP 3也很快的于1998年6月发布。在1999年,Suraski 和 Gutmans 改写了整个PHP 3的核心,并称之为Zend引擎[7],并且在以色列成立了Zend Technologies公司来协助开发PHP。[5]


应用

PHP主要应用在网页服务器,处理使用者的输入来产生网页。但是命令列脚本或是视窗程式接口(GUI)的开发也是PHP的主要应用范围。

服务器端脚本语言

PHP最初就是设计成服务器端脚本语言,因此这也是PHP应用最广的部份。在此领域有许多其他的竞争者,例如ASP.NETColdFusionJSPPerlRuby on Rails等等。

在网络工业领域,PHP是LAMP架构的其中一部分,所谓的LAMP是指Linux、Apache、MySQL、以及PHP所组成的网络环境,提供了许多安全、可靠的网页应用程式。PHP目前已经是全世界最受欢迎的服务器端脚本语言,跨平台的特性更是让PHP广为流传,目前世界上有超过2000万台服务器安装有PHP[8]

命令列脚本

PHP也可以用命令列上执行来使用,例如分析纪录档、系统管理工作等。这些工作过去都是由一些其他的脚本语言例如PerlPythonawk等来执行。

图形使用者接口(GUI)

透过和GUI函式库GTK+的结合,PHP也可以应用在图形使用者接口(GUI)的开发上,目前的应用还不普遍。

语法

PHP的语法参考了PerlC语言,而且可以整合在HTML之中,以下是一个简单的Hello World程式:

<?php
    echo 'Hello World!';
 ?>

PHP剖析引擎只剖析<?php?>之间的程式码,而不包含在<?php?>之间的内容则会直接送出,所以可以用以下的方式来将PHP程式码嵌入在HTML之中:

<?php
 //-PHP程式码
 ?>
 html内容
 <?php
 //-PHP程式码
 ?>

但是在判断语句中的HTML代码并不会被直接送出:

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

PHP可以用三种注解的形式:C与C++所使用的“/*...*/”与“//”,和Perl的“#”。

类型

PHP主要有以下四种变量类型:

两种复合类型

两种特殊类型

  • NULL
  • 资源 (resource)[9]

变量

PHP中的变量用“$”后跟变量名表示。变量名是大小写敏感的。有效的变量名以字母或下划线打头,后跟任意数目的字母、数字或下划线。[10]

物件导向

PHP从PHP 3开始有了基本的物件导向的特性,但直到PHP 5将物件导向部份重新改写之后,PHP的物件导向功能才比较完善。现在PHP可以说是一个有完整物件导向功能的语言。

PHP相关资源

函式库

主条目:PHP函式库列表

内建多样化的函数是PHP主要的特点之一,这些开放程式码的函数提供了各种不同的功能,例如档案处理、FTP、字串处理、等等。这些函数的使用方法和C语言相近(例如printf),这也是PHP广为流行的原因之一。

除了内建的函数之外,PHP也提供了很多延伸函式库(extension),像是各种数据库连接函数、资料压缩函数、图形处理等等。有些延伸函式库需要从PECL(PHP Extension Community Library)取得。

原始码编码和加速

PHP原始码是可以直接读取的,即使放到服务器上执行也是一样。虽然让PHP多了弹性,但相对的会造成安全危机和性能下降的问题。

透过PHP编码器,可以保护PHP的原始码不被读取(对商业软件来说特别有需求),也可以提昇执行的效能。有许多公司或团体开发PHP的编码器,将PHP程式编译成字节码,再透过服务器上安装对应的程式来执行PHP脚本。

除了透过编码器加速之外,PHP还可以透过动态的快取机制来提昇速度,加速工具有商业版的,例如Zend Platform,也有开放原始码的加速软件如eAccelerator、APC、XCache。

样板引擎

样板引擎让PHP应用程式可以做逻辑和使用接口上的分离,让程式开发更容易进行,目前比较受欢迎的样板引擎是PHP官方开发的Smarty。不过样板引擎有效能上的争议,因为PHP本身就是一个样板引擎,使用样板引擎反而变成「重新发明了轮子」(reinventing the wheel)。样板引擎最主要的好处就是让不懂PHP程式码的人也可以参与使用接口的开发,因为样板引擎的语言远比PHP简单。

PEAR

PEARPHP Extension and Application Repository的缩写,由Stig S. Bakken于2000年在PHP开发者会议(PHP Developers' Meeting, PDM) 上提出,目的是实做可以重复使用的函式库来提供PHP社群使用。到今天PEAR已经包含很多类型的函式库,例如数据库连接、内容快取、数学计算、电子商务等等。

PECL

PECL是PHP Extension Community Library的缩写,目的是提供PHP社群各种延伸函式库。PECL在2003年从PEAR专案分离出来,现在已经是一个独立运作的专案。

对PHP的批评

即使PHP是广受欢迎的语言,但仍然受到很多的批评,例如:

  • PHP没有原生支援Unicode或是多位元字集(例如中文、日文、韩文等需要用两个以上ASCII字符来表示的字集),导致用PHP写的软件在国际语言化上遇到相当多的困难。
  • PHP没有命名空间(Namespace)的设计,降低了PHP语言设计上的弹性,也导致函数名称过长的问题。
  • PHP的函数命名规则非常的混乱,许多函数功能类似,但是却使用不同的函数名称和参数顺序,例如strpos($haystack, $needle)in_array($needle, $haystack)strcasecmpstristr,导致编写PHP程式时需要做相当多的手册查询工作,初学者也往往不知不觉重新编写已经内建的函数,降低了开发的效率。
  • PHP的魔术引号(magic quotes)功能可以自动处理使用者输入字串中的跳脱字符,有效避免SQL隐码攻击(SQL injection),但是因为不是每个使用者的输入都会写入到数据库,处理这些没有写入数据库的字串便浪费了效能。此外不是每个PHP环境都会开启魔术引号,程式设计时便需要对不同的服务器环境做因应,造成程式设计上的麻烦。魔术引号功能预计将会于PHP 6时取消。
  • 有些PHP的延伸函式库不是执行绪安全(threadsafe),导致PHP安装在多执行绪的服务器例如Apache 2上会发生不稳定的状况。[11]

未来发展

PHP 5.3

  • 名称空间(namespaces)原本预计在PHP 6支援,现在可能移到PHP 5.3就支援[12]

PHP 6

PHP 6目前已经开始开发,将针对PHP 5的一些缺点做改进[13]

  • 原生Unicode支援
  • 移除魔术引号(magic quotes)
  • 移除长变量名称(HTTP_*_VARS)
  • 移除全域变量(register_globals)
  • 移除安全模式(safe_mode)

PHP 6许多的功能尚未定案,仍然在讨论中,发布的日期也尚未确定。

参考资料

  1. ^ Introduction.PHP Manual.于2006年11月15日查阅.
  2. ^ GPL-Incompatible, Free Software Licenses.Various Licenses and Comments about Them.Free Software Foundation.于2008年2月22日查阅.
  3. ^ PHP: PHP Usage Stats.SecuritySpace(2007年4月1日).于2008年2月24日查阅.
  4. ^ PHP: PHP 5 ChangeLog.The PHP Group(2007年11月8日).于2008年2月22日查阅.
  5. ^ 5.0 5.1 5.2 5.3 History of PHP and related projects.The PHP Group.于2008年2月25日查阅.
  6. ^ Template:Cite newsgroup
  7. ^ Zend Engine version 2.0: Feature Overview and Design.Zend Technologies Ltd..于2006年9月17日查阅.
  8. ^ http://www.php.net/usage.php
  9. ^ Types Introduction,The PHP Group
  10. ^ Language variables,The PHP Group
  11. ^ http://www.php.net/manual/en/faq.installation.php#faq.installation.apache2
  12. ^ Namespaces in action - Stubblog
  13. ^ http://www.php.net/~derick/meeting-notes.html

相关链接

您可以在维基教科书中查找此百科条目的相关电子教程:

PHP相关的书籍

与PHP相关的资源



! __







Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History