PHP7.0
PHP7.0新特性
组合比较符(<=>)
组合比较符号用于比较2个表达式.当$a
小于,等于,大于$b
时分别返回-1,0,1
1 | var_dump(456 <=> 123) //int(1) |
null合并运算符
1 | //php7之前 |
标量类型声明
标量类型声明有两种模式: 强制的,严格的.现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)
1 | function sumOfInts(int ...$ints) |
返回类型声明
1 | function fun(int $a): array |
通过define()
定义常量数组
Array类型的常量现在可以通过define()
来定义,在PHP5.6中只能通过const
定义
1 | define('ANIMALS',[ |
匿名类
PHP7可以通过new class 来实例化一个匿名类
1 | class Application { |
Unicode codepoint 转译语法
这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的。
1 | echo "\u{aa}";// ª |
Closure::call()
闭包绑定Closure::all()
现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用他
1 | class A{private $x =1;} |
为unserialize()
提供过滤
这个特性旨在提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入。
1 | // 将所有的对象都转换为 __PHP_Incomplete_Class 对象 |
IntlChar
新增加的 IntlChar 类旨在暴露出更多的 ICU 功能。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。若要使用此类,请先安装Intl扩展,PHP intl 是国际化扩展,是ICU 库的一个包装器
1 | printf('%x', IntlChar::CODEPOINT_MAX); //10ffff |
Expectations
预期是向后兼用并增强之前的 assert() 的方法。 它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。
1 | ini_set('assert.exception', 1); |
命名空间按组一次性导入
从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。
1 | //PHP7之前 |
生成器可以返回表达式
它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。
1 | $gen = (function() { |
生成器委派
现在,只需在最外层生成其中使用 yield from, 就可以把一个生成器自动委派给其他的生成器, Traversable 对象或者 array。
1 | function gen() |
整数触发函数intdiv
1 | var_dump(intdiv(10,3)) //3 |
会话选项设置
session_start() 可以接受一个 array 作为参数, 用来覆盖 php.ini 文件中设置的 会话配置选项。
1 | session_start([ |
preg_replace_callback_array
可以使用一个关联数组来对每个正则表达式注册回调函数, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值
1 | $subject = 'Aaaaaa Bbb'; |
随机字符和随即整数
新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数
PHP7.0变化
错误和异常处理相关变更
PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。
这也意味着,当发生错误的时候,以前代码中的一些错误处理的代码将无法被触发。 因为在 PHP 7 版本中,已经使用抛出异常的错误处理机制了。 (如果代码中没有捕获 Error 异常,那么会引发致命错误)。set_error_handle不一定接收的是异常,有可能是错误。
ERROR层级结构
1 | interface Throwable |
1 | function handler(Exception $e) { ... } |
list()
list()
会按照原来的顺序进行赋值.不再是逆序
list()
结构现在不能是空的
list()
不再能解开字符串
1 | list($a[], $a[], $a[]) = [1, 2, 3]; |
函数参数附近的括号不在影响行为
在 PHP 5中,在以引用方式传递函数参数时,使用冗余的括号对可以隐匿严格标准 的警告。现在,这个警告总会触发。
1 | function getArray() { |
foreach
的变化
foreach
不在改变内部数组指针
在PHP7之前,当数组通过 foreach 迭代时,数组指针会移动。现在开始,不再如此
1 | $array = [0, 1, 2]; |
foreach
通过值遍历时,操作的值为数组的副本当默认使用通过值遍历数组时,
foerach
实际操作的是数组的迭代副本,而非数组本身。这就意味着,foreach 中的操作不会修改原数组的值。foreach
通过引用遍历时,有更好的迭代特性当使用引用遍历数组时,现在
foreach
在迭代中能更好的跟踪变化1
2
3
4
5
6
7
8
9
10$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
//PHP7以前
// int(0)
//PHP7+
// int(0)
// int(1)非Traversable对象的遍历
迭代一个非Traversable对象将会与迭代一个引用数组的行为相同。 这将导致在对象添加或删除属性时,foreach通过引用遍历时,有更好的迭代特性也能被应用
无效的八进制字符
在之前,一个八进制字符如果含有无效数字,该无效数字将被静默删节(0128 将被解析为 012). 现在这样的八进制字符将产生解析错误。
负位移运算
以负数形式进行的位移运算将会抛出一个 ArithmeticError
1 | var_dump(1 >> -1); |
超范围后产生位移
超出integer
位宽的位移操作(无论哪个方向),将始终得到0的结果.在从前,这一操作是结构依赖的。
十六进制字符不再被认为是数字
1 | var_dump("0x123" == "291"); |
filter_var()
函数可以用于检查一个string
是否含有16进制字符,并将其转化为integer
1 | $str = "0xffff"; |
\u{
可能引起错误
由于新的 Unicode codepoint escape syntax语法, 紧连着无效序列并包含\u{ 的字串可能引起致命错误。 为了避免这一报错,应该避免反斜杠开头。
被移除的函数
call_user_method() and call_user_method_array()
所有的 ereg* 函数
所有ext/mysql,ext/mssql函数
mcrypt别名
已废弃的 mcrypt_generic_end() 函数已被移除,请使用mcrypt_generic_deinit()代替。
此外,已废弃的 mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() 和 mcrypt_ofb() 函数已被移除,请配合恰当的MCRYPT_MODE_* 常量来使用 mcrypt_decrypt()进行代替。
intl别名
已废弃的 datefmt_set_timezone_id() 和 IntlDateFormatter::setTimeZoneID() 函数已被移除,请使用 datefmt_set_timezone() 与 IntlDateFormatter::setTimeZone()代替。
set_magic_qutoes_runtime()
set_magic_quotes_runtime(), 和它的别名 magic_quotes_runtime()已被移除. 它们在PHP 5.3.0中已经被废弃,并且 在in PHP 5.4.0也由于魔术引号的废弃而失去功能。
set_socket_blocking()
已废弃的 set_socket_blocking() 函数已被移除,请使用stream_set_blocking()代替。
dl()
dl()在 PHP-FPM 不再可用,在 CLI 和 embed SAPIs 中仍可用。
GD扩展删除对PostScriptType1字体的支持
已从GD扩展中删除对PostScript Type1字体的支持,从而删除了以下功能
- imagepsbbox()
- imagepsencodefont()
- imagepsextendfont()
- imagepsfreefont()
- imagepsloadfont()
- imagepsslantfont()
- imagepstext()
- 推荐使用 TrueType 字体和相关的函数作为替代。
移除了ASP和script PHP标签
开标签 | 闭标签 |
---|---|
<% |
%> |
<%= |
%> |
<script language="php"> |
</script> |
$HTTP_RAW_POST_DATA 被移除
不再提供 $HTTP_RAW_POST_DATA 变量。 请使用 php://input 作为替代。
INI 文件中 # 注释格式被移除
在 INI 文件中,不再支持以 # 开始的注释行, 请使用 ;(分号)来表示注释。 此变更适用于 php.ini 以及用 parse_ini_file() 和 parse_ini_string() 函数来处理的文件。
PHP7.1
PHP7.1新特性
可为空(Nullable)类型
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。 当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null
1 | function testReturn(): ?string |
Void函数
一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL 不是一个合法的返回值。
1 | //不能有返回值,即使null也不行 |
类常量可见性
类常量可以设置public,private,protected
1 | class ConstDemo |
list()
list()
可简写为[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20$data = [
[1, 'Tom'],
[2, 'Fred'],
];
// list() style
list($id1, $name1) = $data[0];
// [] style
[$id1, $name1] = $data[0];
// list() style
foreach ($data as list($id, $name)) {
// logic here with $id and $name
}
// [] style
foreach ($data as [$id, $name]) {
// logic here with $id and $name
}list()
中指定key1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27$array = ["a" => 1, "b" => 2, "c" => 3];
["a" => $a, "b" => $b, "c" => $c] = $array;
//相当于
$a = $array['a'];
$b = $array['b'];
$c = $array['c'];
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
// [] style
["id" => $id1, "name" => $name1] = $data[0];
// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
// logic here with $id and $name
}
// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
// logic here with $id and $name
}
iterable伪类
这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象.
1 | function iterator(iterable $iter) |
多异常捕获
一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。
1 | try { |
字符串支持负偏移
1 | var_dump("abcdef"[-2]); //string(1)"e" |
openssl支持AEAD
通过给openssl_encrypt()和openssl_decrypt() 添加额外参数,现在支持了AEAD (模式 GCM and CCM)。
Clourse::fromCallable()将callable转化为闭包
Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。
1 | class Test |
http2服务推送
对服务器推送的支持现在已经被加入到 CURL 扩展中( 需要版本 7.46 或更高)。这个可以通过 curl_multi_setopt() 函数与新的常量 CURLMOPT_PUSHFUNCTION 来进行调节。常量 CURL_PUST_OK 和 CURL_PUSH_DENY 也已经被添加进来,以便服务器推送的回调函数来表明自己会同意或拒绝处理。
异步信号处理
一个新的名为 pcntl_async_signals() 的方法现在被引入, 用于启用无需 ticks (这会带来很多额外的开销)的异步信号处理。
PHP7.1变更
当传递参数过少时将抛出错误
在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生一个警告(warning)。 现在,这个警告被提升为一个错误异常(Error exception)。这个变更仅对用户定义的函数生效, 并不包含内置函数
1 | function test($param){} |
禁止动态调用的函数
1 | assert() - with a string as the first argument |
1 | (function () { |
数字串转换现在遵循科学计数法
修复mt_rand算法
rand()别名为mt_rand,srand()别名为mt_srand
Disallow the ASCII delete control character in identifiers
error_log随着syslog变化
如果error_log ini设置设置为syslog,则PHP错误级别将映射到syslog错误级别。 与前一种方法相比,这会在错误日志中带来更细微的区别,其中所有错误仅以通知级别记录。
在不完整的对象上不再调用析构方法
call_user_func()](http://php.net/manual/zh/function.call-user-func.php)不再支持对传址的函数的调用
call_user_func() 现在在调用一个以引用作为参数的函数时将始终失败。
字符串不再支持空索引操作符
对字符串使用一个空索引操作符(例如$str[] = $x)将会抛出一个致命错误, 而不是静默地将其转为一个数组。
ini配置项移除
下列ini配置项已经被移除:
session.entropy_file
session.entropy_length
session.hash_function
session.hash_bits_per_character
ext/mcrypt
mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。
mb_ereg_replace()](http://php.net/manual/zh/function.mb-ereg-replace.php)和[mb_eregi_replace()](http://php.net/manual/zh/function.mb-eregi-replace.php)的Eval选项
对于mb_ereg_replace()和mb_eregi_replace()的 e模式修饰符现在已被废弃。
PHP7.2
PHP7.2新特性
新的对象类型
这种新的对象类型, object, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。
1 | function test(object $obj) : object |
通过名称加载扩展
1 | ; ini file |
允许重写抽象方法(Abstract method)
当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。
1 | abstract class A |
使用Argon2算法生成密码散列
Argon2 已经被加入到密码散列(password hashing) API (这些函数以 password_ 开头), 以下是暴露出来的常量:
- PASSWORD_ARGON2I
- PASSWORD_ARGON2_DEFAULT_MEMORY_COST
- PASSWORD_ARGON2_DEFAULT_TIME_COST
- PASSWORD_ARGON2_DEFAULT_THREADS
新增 ext/PDO(PDO扩展) 字符串扩展类型
当你准备支持多语言字符集,PDO的字符串类型已经扩展支持国际化的字符集。以下是扩展的常量:
- PDO::PARAM_STR_NATL
- PDO::PARAM_STR_CHAR
- PDO::ATTR_DEFAULT_STR_PARAM
这些常量通过PDO::PARAM_STR利用位运算OR进行计算:
1 | 'über', PDO::PARAM_STR | PDO::PARAM_STR_NATL); $db->quote( |
允许分组命名空间的尾部逗号
1 | use Foo\Bar\{ |
PHP7.2变更
不带引号的字符串
不带引号的字符串是不存在的全局常量,转化成他们自身的字符串。 在以前,该行为会产生 E_NOTICE,但现在会产生 E_WARNING。在下一个 PHP 主版本中,将抛出 Error 异常。
1 | var_dump(NONEXISTENT); |
####png2wbmp() 和 jpeg2wbmp()
GD 扩展内的 png2wbmp() 和 jpeg2wbmp() 现已被废弃,将在下一个 PHP 主版本中移除。
INTL_IDNA_VARIANT_2003 转化
Intl 扩展废弃了 INTL_IDNA_VARIANT_2003 转化,为idn_to_ascii() 和 idn_to_utf8() 的默认选项。 PHP 7.4 会把默认值设置为 INTL_IDNA_VARIANT_UTS46, 并在下一个 PHP 主版本中完全移除 INTL_IDNA_VARIANT_2003。
__autoload() 方法
__autoload() 方法已被废弃, 因为和 spl_autoload_register() 相比功能较差 (因为无法链式处理多个 autoloader), 而且也无法在两种 autoloading 样式中配合使用。
track_errors
ini 设置和 $php_errormsg 变量
当开启了 track_errors
ini 设置,出现非致命错误时, 会在本地作用域创建 $php_errormsg 变量。 由于提供了更好的方式: error_get_last() 来获取此类错误信息,该功能被废弃。
create_function() 函数
考虑到此函数的安全隐患问题(它是 eval() 的瘦包装器),该过时的函数现在已被废弃。 更好的选择是匿名函数。
mbstring.func_overload
ini 设置
由于此设置会影响环境中的字符串系列函数,带来相互操作中的问题,它现在已被废弃。
(unset) 类型强制转化
转化任意表达式为此类型,结果总是 NULL,所以这个多余的类型转化现在也就被废弃了。
parse_str() 不加第二个参数
使用 parse_str() 时,不加第二个参数会导致查询字符串参数导入当前符号表。 考虑到安全隐患问题,不加第二个参数使用 parse_str() 的行为已被废弃。 此函数的第二个选项为必填项,它使查询字符串转为 Array。
gmp_random() 函数
此函数基于未知的、取决于平台的 limb 尺寸产生随机数。因此,该函数已被废弃。 使用更好的方式产生随机数: GMP 扩展中的 gmp_random_bits() 和 gmp_random_range()。
each() 函数
使用此函数遍历时,比普通的 foreach 更慢, 并且给新语法的变化带来实现问题。因此它被废弃了。
assert() 一个字符串参数
assert() 字符串参数将要求它能被 eval() 执行。 考虑到可能被执行远程代码,废弃了字符串的 assert(),最好提供 bool 的表达式。
错误处理器内的 $errcontext 参数
$errcontext 参数包含了错误网站的所有本地变量。 考虑到它很少被用到,而且还会导致内部优化问题,它现在被废弃了。 代替用法:调试器应该自己取回错误站点的本地变量。
read_exif_data() 函数
read_exif_data() 别名已被废弃 使用 exif_read_data() 函数代替。