PHP版本
PHP7.1.x版本特性
# 新特性 #### 1. 可为空(Nullable)类型 >参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。 当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。 ```php function testReturn(): ?string{ return 'elePHPant'; } function test(?string $name){ var_dump($name); } ``` ##### 2. void 函数 >一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL 不是一个合法的返回值。 返回的类型还有 void,定义返回类型为 void 的函数不能有返回值,即使返回 null 也不行。 void 函数可以省去 return 语句,或者使用一个空的 return 语句。 ```php function swap(&$left, &$right) : void{ if ($left === $right) { return; } $tmp = $left; $left = $right; $right = $tmp; } $a = 1; $b = 2; var_dump(swap($a, $b), $a, $b); ``` #### 3. 类常量可见性 >现在起支持设置类常量的可见性。 ```php <?php class ConstDemo{ const PUBLIC_CONST_A = 1; public const PUBLIC_CONST_B = 2; protected const PROTECTED_CONST = 3; private const PRIVATE_CONST = 4; } ``` #### 4. iterable 伪类 >现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。 ```php <?php function iterator(iterable $iter){ foreach ($iter as $val) { // } } ``` #### 5. 多异常捕获处理 >一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。 ```php <?php try { // some code } catch (FirstException | SecondException $e) { // handle first and second exceptions } ``` #### 6. list短数组语法 >短数组语法([])现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量(包括在foreach中) ```php <?php $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 } ``` #### 7. list()现在支持键名 >现在list()和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似) ```php <?php $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 } ``` #### 8. 支持为负的字符串偏移量 >现在所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量,包括通过[]或{}操作字符串下标。在这种情况下,一个负数的偏移量会被理解为一个从字符串结尾开始的偏移量。 ```php <?php var_dump("abcdef"[-2]); var_dump(strpos("aabbcc", "b", -3)); ``` #### 9. 通过 Closure::fromCallable() 将callables转为闭包 >Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。 ```php <?php class Test{ public function exposeFunction() { return Closure::fromCallable([$this, 'privateFunction']); } private function privateFunction($param) { var_dump($param); } } $privFunc = (new Test)->exposeFunction(); $privFunc('some value'); ``` #### 10. 异步信号处理 >一个新的名为 pcntl_async_signals() 的方法现在被引入, 用于启用无需 ticks (这会带来很多额外的开销)的异步信号处理。 ```php <?php pcntl_async_signals(true); // turn on async signals pcntl_signal(SIGHUP, function($sig) { echo "SIGHUP\n"; }); posix_kill(posix_getpid(), SIGHUP); ``` #### 11. HTTP/2 server push support in ext/curl ¶ >对服务器推送的支持现在已经被加入到 CURL 扩展中( 需要版本 7.46 或更高)。这个可以通过 curl_multi_setopt() 函数与新的常量 CURLMOPT_PUSHFUNCTION 来进行调节。常量 CURL_PUST_OK 和 CURL_PUSH_DENY 也已经被添加进来,以便服务器推送的回调函数来表明自己会同意或拒绝处理。 #### 12. 无需散列即可生成 Session ID ¶ Session ID 将不再在生成时进行哈希。这一变化,会导致以下四个 ini 设置不再使用: - session.entropy_file - session.entropy_length - session.hash_function - session.hash_bits_per_character 并增加以下两个 ini 设置: - session.sid_length - 定义会话 ID 的长度(为了向后兼容,默认为 32 个字符) - session.sid_bits_per_character - 定义了每个字符的存储位数(即增加了会话 ID 中可使用的字符范围),为了向后兼容,默认为 4 # 变动的函数 #### 1. JSON - json_encode() 增加新的选项: JSON_UNESCAPED_LINE_TERMINATORS。 这个选项可以在指定 JSON_UNESCAPED_UNICODE 选项的时候, 对于 U+2028 和 U+2029 这两个字符不再进行转义。 #### 2. Session - session_start() 当无法成功初始化会话的时候,返回 false, 并且不会初始化超级变量 $_SESSION。 #### 3. 文件系统 - file_get_contents() 接受负数作为搜索偏移量, 前提是流上下文必须是可搜索的。 - tempnam() 会在退回使用系统临时目录的时候,产生警告。 # 不向后兼容的变更 #### 1. 当传递参数过少时将抛出错误 在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生一个警告(warning)。 现在,这个警告被提升为一个错误异常(Error exception)。这个变更仅对用户定义的函数生效, 并不包含内置函数。 #### 2. 在不完整的对象上不再调用析构方法 对于在执行构造方法时抛出异常的对象,现在析构方法绝不会被调用。在先前的版本中,这个行为取决于对象是否在构造方法以外的地方呗引用(例如一个错误堆栈回溯) #### 3. call_user_func()不再支持对传址的函数的调用 call_user_func() 现在在调用一个以引用作为参数的函数时将始终产生一个警告。先前这取决于这个调用行为是否完全符合条件。 此外, call_user_func() 和 call_user_func_array() 在这种情况下将不再中断函数调用。现在会出现一个包含"expected reference"的警告信息,但函数调用将正常进行。 #### 4. 字符串不再支持空索引操作符 对字符串使用一个空索引操作符(例如$str[] = $x)将会抛出一个致命错误, 而不是静默地将其转为一个数组。 ## 废弃的特性 #### 1. ext/mcrypt mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。 #### 2. mb_ereg_replace()和mb_eregi_replace()的Eval选项 对于mb_ereg_replace()和mb_eregi_replace()的 e模式修饰符现在已被废弃.
顶部
收展
底部
[TOC]
目录
关于VC和线性安全的选择
PHP5.6版本
PHP6版本去哪儿了?
PHP7.0.x版本特性
PHP7.1.x版本特性
PHP7.2.x版本特性
PHP7.3.x版本特性
PHP7.4.x版本特性
PHP8.0.x版本特性
PHP8.1.x版本特性
相关推荐
PHP基础
PHP函数
PHP设计模式
PHP算法