PHP版本对比
Posted 的士特啰嗦司机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP版本对比相关的知识,希望对你有一定的参考价值。
其他历史http://www.cnblogs.com/yjf512/p/3588466.html
php5.3
改动:
1、realpath() 现在是完全与平台无关的. 结果是非法的相对路径比如FILE. "/../x" 将不会工作.
2、call_user_func() 系列函数即使被调用者是一个父类也使用 $this.
3、数组函数 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 将不再接受对象作为参数. 在将这些函数应用于对象时, 请首先将对象转换为数组.
4、按引用传递参数的函数在被按值传递调用时行为发生改变. 此前函数将接受按值传递的参数, 现在将抛出致命错误. 之前任何期待传递引用但是在调用时传递了常量或者字面值 的函数, 需要在调用前改为将该值赋给一个变量。
5、__toString 魔术方法不再接受参数.
6、魔术方法get,set,isset,unset, and __call 应该总是公共的(public)且不能是静态的(static). 方法签名是必须的.
7、现在 __call 魔术方法在访问私有的(private)和被保护的(protected)方法时被调用.
8、函数内 include 或者 require 一个文件时,文件内 将不能使用 func_get_arg(), func_get_args() 和 func_num_args() 函数。
9、goto,namespace关键词被保留。
新功能:
1、添加了命名空间的支持.
2、添加了静态晚绑定支持.
3、增加了goto支持。
4、增加了闭包支持。
5、新增了两个魔术方法,callStatic 和invoke.
6、添加了 Nowdoc 语法支持, 类似于 Heredoc 语法, 但是包含单引号.就是<<\'EOF\'这样的语法。
7、可使用双引号声明 Heredoc, 补充了 Nowdoc 语法.
8、可在类外部使用 const 关键词声明 常量.
9、三元运算操作符有了简写形式: ?:.
10、HTTP 流包裹器将从 200 到 399 全部的状态码都视为成功。
11、允许动态访问静态方法。
12、异常可以被内嵌
13、新增了循环引用的垃圾回收器并且默认是开启的.
14、mail() 现在支持邮件发送日志. (注意: 仅支持通过该函数发送的邮件.)
php5.4
改动:
1、不再支持 安全模式 。任何依赖安全模式的应用在安全方面都需要进行调整。
2、移除 魔术引号 。为避免出现安全问题,依赖此特性的应用可能需要升级。 get_magic_quotes_gpc() 和 get_magic_quotes_runtime() 现在总是返回 FALSE 。 调用 set_magic_quotes_runtime() 将产生一个 E_CORE_ERROR 级别的错误。
3、register_globals 和 register_long_arrays php.ini 指令被移除。
4、调用时的引用传递 被移除。就是不能有f(&$a)这样的形式。
5、break 和 continue 语句不再接受可变参数( 比如: break 1 + foo() * $bar; )。像类似 break 2; 这样的固定参数仍可使用。受此变化影响,不再允许出现 break 0; 和 continue 0; 。
6、在 日期与时间扩展 中,不再支持时区使用 TZ(TimeZone)环境变量设置。必须使用 date.timezone php.ini 配置选项或 date_default_timezone_set() 函数来指定时区。PHP 将不再尝试猜测时区,而是回退到“UTC”并发出一条 E_WARNING 错误。
7、非数字的字符串偏移量,比如a[′foo′]此处a 是一个字符串,现在使用 isset() 时返回 false,使用 empty() 时返回 true,并产生一条 E_WARNING 错误。偏移量类型是布尔和 null 则产生一条 E_NOTICE 错误。 数字字符串(比如a[′2′])仍像以前一样运行。注意像类似′12.3′和′5foobar′这样的偏移量将被视为非数字并产生一条EWARNING错误,但因为向后兼容的原因它们会被分别转换成12和5。注意:下列代码返回不同的结果。str=\'abc\';var_dump(isset($str[\'x\'])); // 在 PHP 5.4 或更新版本返回 false,但在 PHP 5.3 或更低版本返回 true
8、数组转换成字符串将产生一条 E_NOTICE 级别的错误,但返回的结果仍是字符串 "Array" 。
9、NULL 、FALSE 、或 一个空字符串被添加成一个对象的属性时将发出一条 E_WARNING 级别的错误,而不是 E_STRICT 。
10、现在参数名使用全局变量将会导致一个致命错误。禁止类似 function foo($GET, $POST) {} 这样的代码。
11、Salsa10 和 Salsa20 哈希算法 被移除。
12、当使用两个空数组作为参数时, array_combine() 现在返回 array() 而不是 FALSE 。
13、htmlentities() 将像 htmlspecialchars() 一样处理亚洲字符集,这是以前 PHP 版本的处理情况,但现在将会发出一条 E_STRICT 错误。
14、强烈建议不要再使用 eregi() ,此特性在最新版本中被移除。
15、trait,callable,insteadof关键词被保留。
新特性:
1、新增支持 traits 。
2、新增短数组语法,比如a=[1,2,3,4];或a = [\'one\' => 1, \'two\' => 2, \'three\' => 3, \'four\' => 4]; 。
3、新增支持对函数返回数组的成员访问解析,例如 foo()[0] 。
4、现在 闭包 支持 $this 。
5、现在不管是否设置 short_open_tag php.ini 选项,
6、新增在实例化时访问类成员,例如: (new Foo)->bar() 。
7、现在支持 Class::{expr}() 语法。
8、新增二进制直接量,例如:0b001001101
9、改进解析错误信息和不兼容参数的警告。
10、SESSION 扩展现在能追踪文件的 上传进度 。
11、内置用于开发的 CLI 模式的 web server 。
php5.5
改动:
1、已放弃对 Windows XP 和 2003 的支持。构建 Windows 版本的 PHP 需要 Windows Vista 或更新的系统。
2、pack() 和 unpack() 函数的变化
3、移除 PHP logo GUIDs
新特性:
1、新增 Generators,包括yield关键字
2、新增 finally 关键字
3、foreach 现在支持 list()
4、empty() 现在支持传入一个任意表达式,而不仅是一个变量。
5、非变量array和string也能支持下标获取了
6、类名通过::class可以获取
7、增加了opcache扩展
php5.6
改动:
暂时还没整理
新特性:
1、PHP常量支持表达式,包括数学运算、字符串处理等,可以被当作函数的输入参数
2、新增通过...语法定义可变参函数,代替func_get_args()折中实现方法
3、数组和可转换对象被当作函数参数时,可以通过...语法实现自动解包元素,就像其他语言比如Ruby一样的功能。
4、新增求幂运算符**,该运算符的结合方向是向左结合。
5、use语法可以用来引用函数、变量,除了类之外
6、PHP新增了调试模块phpdbg,通过SAPI模块的方式实现调试功能
7、配置项default_charset定义htmlentities()、html_entity_decode()、htmlspecialchars()函数使用编码,默认为utf-8
8、php://input支持多次读取
9、支持超过2G大文件上传
10、新增魔术方法__debugInfo()
11、pgsql支持异步操作
php 7.0.0
改动:
暂无
新特性:
1、性能大幅提升
2、函数参数、返回值增加了变量类型的限定
3、try{}catch可以捕获致命错误
##PHP 5.4新特性## https://gist.github.com/luxixing/7411156
掌握
-
traits
trait的引入,可以扩展class的内容,使class在某种形式上实现了多重继承,更加灵活,trait不能被实例化 举个例子,假设有三个类,男人,女人,人,人是男人和女人的父类,双11购物不是人人都有的行为,放在人 这个父类里显然不合适,我们把双11购物单独定义为一个trait,这个双11购物的trait不能自己驱动,需要被 其他类引用,从而让引用trait的类具有购物行为
示例代码:<?php trait Hello { public function sayHello() { echo \'Hello \' . "\\n"; } } trait World { public function sayWorld() { echo \'World\' . "\\n"; } } class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo \'!\' . "\\n"; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->sayExclamationMark();
需要注意的是,trait的继承顺序
来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法当多个trait被同一个类使用的时候,会出现方法冲突的情况,使用关键词insteadof解决
示例代码:<?php trait A { public function smallTalk() { echo \'a\'; } public function bigTalk() { echo \'A\'; } } trait B { public function smallTalk() { echo \'b\'; } public function bigTalk() { echo \'B\'; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } } class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } }
-
新增短数组语法
<?php $a = [1, 2, 3, 4]; $a = [\'one\' => 1, \'two\' => 2, \'three\' => 3, \'four\' => 4];
-
新增支持对函数返回数组的成员访问解析
<?php function foo() { return array(1,3,4,5); } $var =foo()[0];
-
现在不管是否设置 short_open_tag php.ini 选项,<?= 将总是可用
-
新增在实例化时访问类成员
<?php class Test { public function foo() { //todo return 1; } } $var = (new Test)->foo(); >ps:注意括号
-
SESSION 扩展现在能追踪文件的 上传进度 在php.ini中配置session.upload_progress.enabled = On,就会开启文件上传进度跟踪功能
-
max_input_vars 指令
在php.ini文件中,设定max_input_vars的值,可以控制$_GET、$_POST 和 $_COOKIE的最大长度
降低构造哈希碰撞进行拒绝服务攻击的可能性
了解
-
现在闭包支持 $this
-
现在支持 Class::{expr}() 语法 示例代码:
<?php class Utils { public static function test1() { echo 1; } public static function test2() { echo 2; } } $m = \'test\'; Utils::{$m . (10-8)}(); Utils::test2();
-
新增二进制直接量,例如:0b001001101
##PHP 5.5新特性##
掌握
-
opcache集成在php发行包
opcache实际上是zend公司的Zend Optimizer Plus,功能类同apc
它的性能优于apc,对opcode进行了优化,关于opcache的更多信息
请移步鸟哥博客 一个关于Zend O+的小分享
因此在安装PHP的时候,编译参数一定要加上--enabled-opcache 推荐配置(php.ini) zend_extension=opcache.so opcache.enable_cli=1 opcache.memory_consumption=128 //共享内存大小, 这个根据你们的需求可调 opcache.interned_strings_buffer=8 //interned string的内存大小, 也可调 opcache.max_accelerated_files=4000 //最大缓存的文件数目 opcache.revalidate_freq=60 //60s检查一次文件更新 opcache.fast_shutdown=1 //打开快速关闭, 打开这个在PHP Request Shutdown的时候,回收内存的速度会提高 opcache.save_comments=0 //不保存文件/函数的注释
-
生成器(Generators)
熟悉python的同学对生成器肯定不会陌生的 其功能是在函数中使用关键词yield,中断函数执行并返回一个能在foreach中使用的迭代器 这个语法应该是PHP5.5中最令人激动的特性了 下面的代码演示了生成器用法,并且做了对比,用来突出生成器的优势<?php ini_set(\'memory_limit\', \'512M\'); $cmd = isset($argv[1]) ? (int)$argv[1] : 0; function xrange($start, $end, $step = 1) { if($start <= $end) { if($step <= 0) { throw new LogicException(\'step must be +ve\'); } for($i = $start; $i <= $end; $i = $i + $step) { yield $i; } }else{ if($step >= 0) { throw new LogicException(\'step must be -ve\'); } for($i = $start; $i >= $end; $i = $i + $step) { yield $i; } } } if($cmd == 0) { $r = range(1, 1000000); foreach($r as $v) { if($v > 20) { break; } echo "$v\\t"; } $m = memory_get_usage(true); echo "\\n" . $m/1014/1024 . "M\\n"; }else if($cmd == 1){ $r = xrange(1, 1000000); foreach($r as $v) { if($v > 20) { break; } echo "$v\\t"; } $m = memory_get_usage(true); echo "\\n" . $m / 1014 /1024 . "M\\n"; }else{ include \'php-excel.class.php\'; $stime = microtime(true); if($cmd == 3) { $data = array(); for($i = 0; $i < 10000;$i++) { $data[] = range(1,100); } $xls = new Excel_XML(); $xls->addWorksheet(\'test\', $data); $xls->writeWorkbook(\'test.xls\', \'./\'); }else{ $data = function($n = 10000){ for($i = 0; $i < $n; $i++) { yield xrange(1,100); } }; $xls = new Excel_XML(); $xls->addWorksheet(\'test\', $data()); $xls->writeWorkbook(\'test.xls\', \'./\'); } $ctime = microtime(true) - $stime; $m = memory_get_usage(true); echo "\\n" . $m / 1014 /1024 . "M\\n"; echo "cost time:" . $ctime . "s\\n"; }
ps:php-excel.class.php文件内容请参考本gist php-excel.php
-
新增 finally 关键字 示例代码:
<?php function getLines($file) { $f = fopen($file, \'r\'); try { while ($line = fgets($f)) { yield $line; } } finally { fclose($f); } } foreach(getLines(\'finally.php\') as $v) { echo $v; }
编写代码的时候,一定要养成良好的习惯,及时的释放打开的资源
-
password API
password系列函数,为我们存储密码,实现了更简便安全的方式
密码的存储从明文到md5到md5+salt,到mcrpty+salt password_hash默认使用bcrypt加密算法,自动生成salt,加密密码 示例代码<?php $pw1 = \'123456\'; $pwdb = password_hash($pw1, PASSWORD_DEFAULT); var_dump($pwdb) . "\\n"; var_dump(password_verify($pw1, $pwdb)) . "\\n"; $pw2 = \'778920\'; $pwdb = password_hash($pw2, PASSWORD_DEFAULT); var_dump($pwdb) . "\\n"; var_dump(password_verify($pw1, $pwdb)) . "\\n";
强烈建议新应用开发密码存储使用内置password系列函数
-
array_column
这个函数早就应该有了
我们从数据库中取出10条记录,想要拿到这十条记录中的指定某一列,之前只能foreach了 现在只需要一个array_coulum函数搞定,这个函数实际意义很大,单独提出来讲了 示例代码:<?php // Array representing a possible record set returned from a database $records = array( array( \'id\' => 2135, \'first_name\' => \'John\', \'last_name\' => \'Doe\', ), array( \'id\' => 3245, \'first_name\' => \'Sally\', \'last_name\' => \'Smith\', ), array( \'id\' => 5342, \'first_name\' => \'Jane\', \'last_name\' => \'Jones\', ), array( \'id\' => 5623, \'first_name\' => \'Peter\', \'last_name\' => \'Doe\', ) ); $first_names = array_column($records, \'first_name\'); print_r($first_names);
熟悉
-
foreach 现在支持 list()
<?php $arr= array( array(1,2,3), array(1,2,3), array(1,2,3), ); foreach($arr as list($a, $b, $c)) { //todo } >ps:需要注意的是,遍历数组的子数组个数要一样
-
empty() 支持任意表达式,函数调用也可以使用empty了
了解
- 改进 GD
翻转支持使用新的 imageflip() 函数
高级裁剪支持使用 imagecrop() & imagecropauto() 函数
WebP 的读写分别支持使用 imagecreatefromwebp() & imagewebp()
另外PHP5.4和PHP5.5新增的function,新增的class,新增的interface,新增的全局常量还是挺多的
想了解的,可以查看下面链接
http://www.php.net/manual/zh/migration55.new-functions.php
http://www.php.net/manual/zh/migration55.classes.php
http://www.php.net/manual/zh/migration55.new-methods.php
http://www.php.net/manual/zh/migration55.global-constants.php
http://www.php.net/manual/zh/migration54.functions.php
http://www.php.net/manual/zh/migration54.classes.php
http://www.php.net/manual/zh/migration54.methods.php
http://www.php.net/manual/zh/migration54.global-constants.php
##PHP 5.4不兼容内容##
熟悉
-
安全模式的移除(safe_mode),涉及到php.ini配置指令
安全模式开启,限制PHP中的一些内置函数的使用
代码中如果有依赖于安全模式保障安全的内容,需要调整 -
移除魔术引号(magic_quote),涉及到php.ini配置指令
魔术引号自动对用户提交数据转义(包括不必要转义的数据),性能低下 魔术引号的效果和使用 addslashes() 函数一样 为避免出现安全问题,任何依赖魔术引号特性的代码都需要修改 移除模式引号后,对仅需要存储到数据库中的数据进行*addslashes()*操作 -
调用时的引用传递被移除
<?php function foo(&$var) { $var = \'hello, word\'; var_dump($var); } $var = 1111; foo($var);//正确的调用方法 foo(&$var);//过期用法,报出一个警告错误 ?>
-
在日期与时间扩展中,不再支持时区使用 TZ(TimeZone)环境变量设置
php.ini中强烈建议配置date.timezone
或者在程序入口脚本配置环境时,使用date_default_timezone_set()设定时区 -
数组转换成字符串将产生一条 E_NOTICE 级别的错误,但返回的结果仍是字符串 "Array"
-
现在参数名使用全局变量将会导致一个致命错误
<?php //这样的代码,报致命错误 function foo($_GET, $_POST) {};
-
当使用两个空数组作为参数时, array_combine() 现在返回 array() 而不是 FALSE
-
trait,callable,insteadof成为新的保留字,在函数和类名中不可使用
了解
-
register_globals 和 register_long_arrays php.ini 指令被移除
-
break 和 continue 语句不再接受可变参数
<?php define(\'VAR\', 10); while(true) { while(true) { //正确写法 break 10; continue VAR; //错误写法 break 10 - $var; contnue $var * 10; } }
-
NULL 、FALSE 、或 一个空字符串被添加成一个对象的属性时将发出一条 E_WARNING 级别的错误,而不是 E_STRICT
-
Salsa10 和 Salsa20 哈希算法 被移除
-
强烈建议不要再使用 eregi()
-
移除的函数
define_syslog_variables() import_request_variables() session_is_registered() 、 session_register() 以及 session_unregister() mysqli_bind_param() 、 mysqli_bind_result() 、 mysqli_client_encoding() mysqli_fetch() 、 mysqli_param_count() 、 mysqli_get_metadata()
-
过时的函数
mcrypt_generic_end() mysql_list_dbs()
-
sqlite扩展被移到 pecl扩展中,不包含在PHP发行版中
##PHP5.5不兼容内容##
熟悉
- 原始的 MySQL 扩展 现在被废弃(不推荐使用,下版本将会移除)
当连接到数据库时会产生一个 E_DEPRECATED 错误。可使用 MySQLi 或 PDO_MySQL 扩展作为替代
了解
-
windows xp & windows server 2003支持取消。还在使用这两个环境就太out了
-
移除 PHP logo GUIDs组函数
php_logo_guid()
php_egg_logo_guid()
php_real_logo_guid()
zend_logo_guid() -
preg_replace() 中的 /e 修饰符被标识为不推荐使用
替代方案是使用 preg_match_replace -
mcrypt 中的下列函数过期(在未来版本会被移除)
mcrypt_cbc() mcrypt_cfb() mcrypt_ecb() mcrypt_ofb()
-
intl 中的废弃
IntlDateFormatter::setTimeZoneID() 和 datefmt_set_timezone_id() 现在被废弃 可分别使用 IntlDateFormatter::setTimeZone() 方法和 datefmt_set_timezone() 函数作为替代 -
pack() 和 unpack() 函数的变化 添加了Z格式和perl兼容 这两个函数在二进制接口使用
##PHP5.4-5.5变更##
ps:本部分内容不再具体区分版本号
-
mysqlnd
mysql mysqli及PDO_mysql现在使用mysqlnd作为默认库 强烈建议使用mysqlnd库和PDO_mysql
在编译安装PHP的时候,加上如下参数--enable-mysqlnd --with-mysqli --with-pdo-mysql
-
intl 扩展现在需要 ICU 4.0 或更高版本
-
pdo_mysql不再支持使用低于 4.1 版本的 MySQL 客户端库连接
更多变更请访问下面的资源
http://www.php.net/manual/zh/migration54.parameters.php
http://www.php.net/manual/zh/migration55.changed-functions.php
http://www.php.net/manual/zh/migration54.ini.php
http://www.php.net/manual/zh/migration55.ini.php
上面的变更主要是函数参数和php.ini配置指令在php5.4,php5.5中的变化 其中一些变更
和新增特性,不兼容部分有交叉
以上是关于PHP版本对比的主要内容,如果未能解决你的问题,请参考以下文章