php的发展历史
php最初就是为了快速构建⼀个web页⾯⽽迅速被⼤家⼴为接受的。它的好处是在代码中能内嵌html的代码,从⽽让程序员能再⼀个页⾯中同时写html代码和php代码就能⽣成⼀个web页⾯。
这篇⽂章⽤时间轴的⾓度来记录⼀下php的历史。
PHP之⽗Rasmus Lerdorf
PHP版本历史
1995年初
PHP1.0诞⽣
Rasmus Lerdof发明了PHP,这是简单的⼀套Perl脚本,⽤来跟踪访问者的信息。这个时候的PHP只是⼀个⼩⼯具⽽已,它的名字叫
做“Personal Home Page Tool”(个⼈主页⼩⼯具)。
1995年6⽉
PHP2.0诞⽣
Rasmus Lerdof⽤C语⾔来重新开发这个⼯具,取代了最初的Perl程序。这个新的⽤C写的⼯具最⼤的特⾊就是可以访问数据库,可以让⽤户简单地开发动态Web程序了。这个⽤C写的⼯具⼜称为PHP/FI。它已经有了今天php的⼀些基本功能了。
⾃Rasmus在1995年6⽉将PHP/FI发布源码之后,到1997年,全世界⼤约有⼏千个⽤户(估计)和⼤约50000个域名安装。
1998年6⽉
PHP3.0诞⽣
虽然说98年6⽉才正式发布php3.0,但是在正式发布之前,已经经过了9个⽉的公开测试了。
Andi Gutmans和Zeev Suraski加⼊了PHP开发项⽬组。这是两个以⾊列⼯程师,他们在使⽤PHP/FI的时候发现了PHP的⼀些缺点,然后决定重写PHP的解析器。注意,在这个时候,PHP就不再称为Personal Home Page了。⽽改称为PHP:Hypertext Preprocessor。
PHP3是最像现在使⽤的php的第⼀个版本,这个重写的解释器也是后来Zend的雏形。PHP3.0的最强⼤的功能就是它的可扩展性。它提供给第三⽅开发者数据库,协议,和API的基础结构之外,还吸引了⼤量的开发⼈员加⼊并提交新的模块。
php文件下载源码2000年5⽉
PHP4.0发布
Andi Gutmans和Zeev Suranski在4.0做的最⼤的动作就是重写了PHP的代码,发明了Zend引擎来增强程序运⾏时的性能和PHP的模块性。这个Zend实际上就是Andi和Zeev名字缩写的合称。
使⽤了Zend引擎,PHP获得了更⾼的性能之外,也有其他⼀些关键的功能,包括⽀持更多的web服务器;HTTP Session的⽀持;输出缓冲等。
2004年7⽉
PHP5.0发布
PHP5.0的核⼼是Zend引擎2代。它引⼊了新的对象模型和⼤量的新功能。⽐如引⼊了PDO(PHP Data Object)
现在(2014年2⽉)
最新的PHP 已经发布到5.6了,据说PHP6.0已经在开发过程中了。所有php的历史代码可以在到。
php最近⼏个版本的功能描述
php4.0
以Zend引擎作为解析器
php4.1
加⼊超全局变量功能,包括GET,GET,_POST,$_SESSION等
php4.2
从⽹络接收的数据将不会设置成全局变量,增加程序的安全性。
php4.3
加⼊命令档,成为CLI
php4.4
加⼊phpize和php-config的man页⾯
php5.0
使⽤了Zend 2 引擎。
增加了新关键字,包括this,try,catch,public,private,protected等
strrpos() 和 strripos() 如今使⽤整个字符串作为 needle。
⾮法使⽤字符串偏移量会导致 E_ERROR ⽽不是 E_WARNING。⼀个⾮法使⽤的例⼦:str=′abc′;unset(str=′abc′;unset(str[0]);.
array_merge() 被改成只接受数组。如果传递⼊⾮数组变量,对每个此类参数都会发出⼀条 E_WARNING 信息。要⼩⼼因为你的代码有可能疯狂发出 E_WARNING。
如果 variables_order 包括“S”,SERVER应该带有argc和argv被产⽣。如果⽤户特别配制系统不创建SERVER应该带有argc和argv被产⽣。如果⽤户特别配制系统不创建_SERVER,那此变量当然就不存在了。改变的地⽅是不管 variables_order 怎么设定,在 CLI 版本中 argc 和 argv 总是可⽤的。本来 CLI 版不是总会产⽣全局变量 argc和argc和argv 的。
没有属性的对象不再被当成“empty”。
get_class(),get_parent_class() 和 get_class_methods() 如今返回的类/⽅法名和定义时的名字⼀致(区分⼤⼩写),对于依赖以前⾏为(类/⽅法名总是返回⼩写的)的⽼脚本可能产⽣问题。⼀个可能的解决⽅法是在脚本中搜索所有这些函数并使⽤ strtolower()。
区分⼤⼩写的改变也适⽤于魔术常量 CLASS,METHOD 和 FUNCTION。其值都会严格按照定义时的名字返回(区分⼤⼩写)。
ip2long() 在传递⼊⼀个⾮法 IP 作为参数时返回 FALSE,不再是 -1。
如果有函数定义在包含⽂件中,则这些函数可以在主⽂件中使⽤⽽与是否在 return 指令之前还是之后⽆关。如果⽂件被包含两次,PHP 5 会发出致命错误,因为函数已经被定义,⽽ PHP 4 不管这个。因此推荐使⽤ include_once ⽽不要去检查⽂件是否已被包含以及在包含⽂件中有条件返回。
include_once 和 require_once 在 Windows 下先将路径规格化,因此包含 A.php 和 a.php 只会把⽂件包含⼀次。
更多参考资料
php 5.1
重写了数据处理部分的代码
PDO扩展默认启动
性能优化
超过30个新函数
超过400个bug修复
php5.2
CLI SAPI不再从php.ini和php-cli.ini中获取当前⽬录信息。这是从安全⾓度考虑的。
对0取模的时候会提⽰Warning信息。
对象可以通过__toString()函数被当做字符串调⽤。
禁⽌设置抽象类的静态⽅法
增加RFC(。
更多参考资料
php5.3
改动:
realpath() 现在是完全与平台⽆关的. 结果是⾮法的相对路径⽐如 FILE . "/../x" 将不会⼯作.
call_user_func() 系列函数即使被调⽤者是⼀个⽗类也使⽤ $this.
数组函数 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 将不再接受对象作为参数. 在将这些函数应⽤于对象时, 请⾸先将对象转换为数组.
按引⽤传递参数的函数在被按值传递调⽤时⾏为发⽣改变. 此前函数将接受按值传递的参数, 现在将抛出致命错误. 之前任何期待传递引⽤但是在调⽤时传递了常量或者字⾯值的函数, 需要在调⽤前改为将该值赋给⼀个变量。
__toString 魔术⽅法不再接受参数.
魔术⽅法 __get, __set, __isset, __unset, and __call 应该总是公共的(public)且不能是静态的(static). ⽅法签名是必须的.
现在 __call 魔术⽅法在访问私有的(private)和被保护的(protected)⽅法时被调⽤.
函数内 include 或者 require ⼀个⽂件时,⽂件内将不能使⽤ func_get_arg(), func_get_args() 和 func_num_args() 函数。
goto,namespace关键词被保留。
新功能:
添加了命名空间的⽀持.
添加了静态晚绑定⽀持.
增加了goto⽀持。
增加了闭包⽀持。
新增了两个魔术⽅法, __callStatic 和 __invoke.
添加了 Nowdoc 语法⽀持, 类似于 Heredoc 语法, 但是包含单引号.就是<<'EOF'这样的语法。
可使⽤双引号声明 Heredoc, 补充了 Nowdoc 语法.
可在类外部使⽤ const 关键词声明常量.
三元运算操作符有了简写形式: ?:.
HTTP 流包裹器将从 200 到 399 全部的状态码都视为成功。
允许动态访问静态⽅法。
异常可以被内嵌
新增了循环引⽤的垃圾回收器并且默认是开启的.
mail() 现在⽀持邮件发送⽇志. (注意: 仅⽀持通过该函数发送的邮件.)
更多参考资料
php5.4
改动:
不再⽀持安全模式。任何依赖安全模式的应⽤在安全⽅⾯都需要进⾏调整。
移除魔术引号。为避免出现安全问题,依赖此特性的应⽤可能需要升级。 get_magic_quotes_gpc() 和 get_magic_quotes_runtime()现在总是返回 FALSE 。调⽤ set_magic_quotes_runtime() 将产⽣⼀个 E_CORE_ERROR 级别的错误。
register_globals 和 register_long_arrays php.ini 指令被移除。
调⽤时的引⽤传递被移除。就是不能有f(&$a)这样的形式。
break 和 continue 语句不再接受可变参数(⽐如: break 1 + foo() * $bar; )。像类似 break 2; 这样的固定参数仍可使⽤。受此变化影响,不再允许出现 break 0; 和 continue 0; 。
在⽇期与时间扩展中,不再⽀持时区使⽤ TZ(TimeZone)环境变量设置。必须使⽤ date.timezone php.ini 配置选项或
date_default_timezone_set() 函数来指定时区。PHP 将不再尝试猜测时区,⽽是回退到“UTC”并发出⼀条 E_WARNING 错误。
⾮数字的字符串偏移量,⽐如 a[′foo′]此处a[′foo′]此处a 是⼀个字符串,现在使⽤ isset() 时返回 false,使⽤ empty() 时返回 true,并产⽣⼀条 E_WARNING 错误。偏移量类型是布尔和 null 则产⽣⼀条 E_NOTICE 错误。数字字符串(⽐如 $a['2'] )仍像以前⼀样运⾏。
注意像类似 '12.3' 和 '5 foobar' 这样的偏移量将被视为⾮数字并产⽣⼀条 E_WARNING 错误,但因为向后兼容的原因它们会被分别转换成 12 和 5 。注意:下列代码返回不同的结果。 str=′abc′;vardump(isset(str=′abc′;vardump(isset(str['x'])); // 在 PHP 5.4 或更新版本
返回 false,但在 PHP 5.3 或更低版本返回 true
数组转换成字符串将产⽣⼀条 E_NOTICE 级别的错误,但返回的结果仍是字符串 "Array" 。
NULL 、FALSE 、或⼀个空字符串被添加成⼀个对象的属性时将发出⼀条 E_WARNING 级别的错误,⽽不是 E_STRICT 。
现在参数名使⽤全局变量将会导致⼀个致命错误。禁⽌类似 function foo(GET,GET,_POST) {} 这样的代码。
Salsa10 和 Salsa20 哈希算法被移除。
当使⽤两个空数组作为参数时, array_combine() 现在返回 array() ⽽不是 FALSE 。
htmlentities() 将像 htmlspecialchars() ⼀样处理亚洲字符集,这是以前 PHP 版本的处理情况,但现在将会发出⼀条 E_STRICT 错误。
强烈建议不要再使⽤ eregi() ,此特性在最新版本中被移除。
trait,callable,insteadof关键词被保留。
新特性:
新增⽀持 traits 。
新增短数组语法,⽐如 a=[1,2,3,4];或a=[1,2,3,4];或a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; 。
新增⽀持对函数返回数组的成员访问解析,例如 foo()[0] 。
现在闭包⽀持 $this 。
现在不管是否设置 short_open_tag php.ini 选项,<?= 将总是可⽤。
新增在实例化时访问类成员,例如: (new Foo)->bar() 。
现在⽀持 Class::{expr}() 语法。
新增⼆进制直接量,例如:0b001001101
改进解析错误信息和不兼容参数的警告。
SESSION 扩展现在能追踪⽂件的上传进度。
内置⽤于开发的 CLI 模式的 web server 。
更多参考资料
php5.5
改动:
已放弃对 Windows XP 和 2003 的⽀持。构建 Windows 版本的 PHP 需要 Windows Vista 或更新的系统。
pack() 和 unpack() 函数的变化
移除 PHP logo GUIDs
新特性:
新增 Generators,包括yield关键字
新增 finally 关键字
foreach 现在⽀持 list()
empty() 现在⽀持传⼊⼀个任意表达式,⽽不仅是⼀个变量。
⾮变量array和string也能⽀持下标获取了
类名通过::class可以获取
增加了opcache扩展
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论