·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

PHP7.0-PHP7.3新特性和变更汇总

368 2
发表于 2020-7-7 08:55:12 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
php7发布已经升级到7.2.里面发生了很多的变化。本文整理php7.0至php7.2的新特性和一些变化。
参考资料:

http://php.net/manual/zh/migration70.new-features.php

http://php.net/manual/zh/migration71.new-features.php

http://php.net/manual/zh/migration72.new-features.php

PHP7.0新特性
1. 组合比较符 (<=>)
组合比较符号用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1,比较规则延续常规比较规则。对象不能进行比较
  1. var_dump('PHP' <=> 'Node'); // int(1)var_dump(123 <=> 456); // int(-1)var_dump(['a', 'b'] <=> ['a', 'b']); // int(0)
复制代码
2. null合并运算符
由于日常使用中存在大量同时使用三元表达式和isset操作。使用null合并运算符可以简化操作

  1. # php7以前if(isset($_GET['a'])) {  $a = $_GET['a'];}# php7以前$a = isset($_GET['a']) ? $_GET['a'] : 'none';#PHP 7$a = isset($_GET['a']) ?? 'none';
复制代码
4. 变量类型声明
变量类型声明有两种模式。一种是强制的,和严格的。允许使用下列类型参数int、string、float、bool

同时不能再使用int、string、float、bool作为类的名字了
  1. function sumOfInts(int ...$ints){return array_sum($ints);}ar_dump(sumOfInts(2, '3', 4.1)); // int(9)# 严格模式declare(strict_types=1);function add(int $x, int $y){return $x + $y;}var_dump(add('2', 3)); // Fatal error: Argument 1 passed to add() must be of the type integer
复制代码
5. 返回值类型声明
增加了返回类型声明,类似参数类型。这样更方便的控制函数的返回值.在函数定义的后面加上:类型名即可
  1. function fun(int $a): array{return $a;}fun(3);//Fatal error
复制代码
6. 匿名类
php7允许new class {} 创建一个匿名的对象。
  1. //php7以前class Logger{public function log($msg){echo $msg;    }}$util->setLogger(new Logger());// php7+$util->setLogger(new class {public function log($msg){echo $msg;    }});
复制代码
7. Unicode codepoint 转译语法
这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的
  1. echo "\u{aa}";// aecho "\u{0000aa}";// aecho "\u{9999}";// 香
复制代码
8. Closure::call
闭包绑定 简短干练的暂时绑定一个方法到对象上闭包并调用它。
  1. class A {private $x = 1;}// PHP 7 之前版本的代码$getXCB = function() {return $this->x;};$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包echo $getX();// PHP 7+ 及更高版本的代码$getX = function() {return $this->x;};echo $getX->call(new A);
复制代码
9. 带过滤的unserialize
提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入
  1. // 将所有的对象都转换为 __PHP_Incomplete_Class 对象$data = unserialize($foo, ["allowed_classes" => false]);// 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);// 默认情况下所有的类都是可接受的,等同于省略第二个参数$data = unserialize($foo, ["allowed_classes" => true]);
复制代码
10. IntlChar类
这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。需要安装intl拓展
  1. printf('%x', IntlChar::CODEPOINT_MAX);echo IntlChar::charName('@');var_dump(IntlChar::ispunct('!'));
复制代码
11. 预期
它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。以后可以使用这个这个进行断言测试
  1. ini_set('assert.exception', 1);class CustomError extends AssertionError {}assert(false, new CustomError('Some error message'));
复制代码
12. 命名空间按组导入
从同一个命名空间下导入的类、函数、常量支持按组一次导入
  1. #php7以前use app\model\A;use app\model\B;#php7+use app\model{A,B}
复制代码
13.生成器支持返回表达式
它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。
  1. $gen = (function() {yield 1;yield 2;return 3;})();foreach ($gen as $val) {echo $val, PHP_EOL;}echo $gen->getReturn(), PHP_EOL;# output//1//2//3
复制代码
14.生成器委派
现在,只需在最外层生成其中使用yield from,就可以把一个生成器自动委派给其他的生成器
  1. function gen(){yield 1;yield 2;yield from gen2();}function gen2(){yield 3;yield 4;}foreach (gen() as $val){echo $val, PHP_EOL;}
复制代码
15.整数除法函数intdiv
  1. var_dump(intdiv(10,3)) //3
复制代码
16.会话选项设置
session_start() 可以加入一个数组覆盖php.ini的配置
  1. session_start(['cache_limiter' => 'private','read_and_close' => true,]);
复制代码
17. preg_replace_callback_array
可以使用一个关联数组来对每个正则表达式注册回调函数, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值
  1. string preg_replace_callback_array(array $regexesAndCallbacks, string $input);$tokenStream = []; // [tokenName, lexeme] pairs$input = <<<'end'$a = 3; // variable initialisationend;// Pre PHP 7 codepreg_replace_callback(    ['~\$[a-z_][a-z\d_]*~i','~=~','~[\d]+~','~;~','~//.*~'    ],function ($match) use (&$tokenStream) {if (strpos($match[0], '18. 随机数、随机字符函数[code]string random_bytes(int length);int random_int(int min, int max);
复制代码
19. define 支持定义数组
  1. #php7+define('ALLOWED_IMAGE_EXTENSIONS', ['jpg', 'jpeg', 'gif', 'png']);
复制代码
PHP7.0 变化1. 错误和异常处理相关变更
PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

这也意味着,当发生错误的时候,以前代码中的一些错误处理的代码将无法被触发。 因为在 PHP 7 版本中,已经使用抛出异常的错误处理机制了。 (如果代码中没有捕获 Error 异常,那么会引发致命错误)。set_error_handle不一定接收的是异常,有可能是错误。

ERROR层级结构
  1. interface Throwable    |- Exception implements Throwable        |- ...    |- Error implements Throwable        |- TypeError extends Error        |- ParseError extends Error        |- AssertionError extends Error        |- ArithmeticError extends Error            |- DivisionByZeroError extends ArithmeticError
复制代码
  1. function handler(Exception $e) { ... }set_exception_handler('handler');// 兼容 PHP 5 和 7function handler($e) { ... }// 仅支持 PHP 7function handler(Throwable $e) { ... }
复制代码
2. list
list 会按照原来的顺序进行赋值。不再是逆序了
  1. list($a,$b,$c) = [1,2,3];var_dump($a);//1var_dump($b);//2var_dump($c);//3
复制代码
list不再支持解开字符串、

3. foreach不再改变内部数组指针
  1. <?php$array = [0, 1, 2];foreach ($array as &$val) {    var_dump(current($array));}?>#php 5int(1)int(2)bool(false)#php7int(0)int(0)int(0)
复制代码
4. 十六进制字符串不再被认为是数字
  1. var_dump("0x123" == "291");#php5true#php7false
复制代码
5.$HTTP_RAW_POST_DATA 被移
$HTTP_RAW_POST_DATA 被移 使用php://input代替

6. 移除了 ASP 和 script PHP 标签
开标签

闭标签


<%%>
<%=%>
<script language="php"></script>

) === 0) {
            $tokenStream[] = ['T_VARIABLE', $match[0]];
        } elseif (strpos($match[0], '=') === 0) {
            $tokenStream[] = ['T_ASSIGN', $match[0]];
        } elseif (ctype_digit($match[0])) {
            $tokenStream[] = ['T_NUM', $match[0]];
        } elseif (strpos($match[0], ';') === 0) {
            $tokenStream[] = ['T_TERMINATE_STMT', $match[0]];
        } elseif (strpos($match[0], '//') === 0) {
            $tokenStream[] = ['T_COMMENT', $match[0]];
        }
    },
    $input
);

// PHP 7+ code
preg_replace_callback_array(
    [
'~\$[a-z_][a-z\d_]*~i' => function ($match) use (&$tokenStream) {
            $tokenStream[] = ['T_VARIABLE', $match[0]];
        },
'~=~' => function ($match) use (&$tokenStream) {
            $tokenStream[] = ['T_ASSIGN', $match[0]];
        },
'~[\d]+~' => function ($match) use (&$tokenStream) {
            $tokenStream[] = ['T_NUM', $match[0]];
        },
'~;~' => function ($match) use (&$tokenStream) {
            $tokenStream[] = ['T_TERMINATE_STMT', $match[0]];
        },
'~//.*~' => function ($match) use (&$tokenStream) {
            $tokenStream[] = ['T_COMMENT', $match[0]];
        }
    ],
    $input
);[/code]18. 随机数、随机字符函数
  1. string random_bytes(int length);int random_int(int min, int max);
复制代码
19. define 支持定义数组
  1. #php7+define('ALLOWED_IMAGE_EXTENSIONS', ['jpg', 'jpeg', 'gif', 'png']);
复制代码
PHP7.0 变化1. 错误和异常处理相关变更
PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

这也意味着,当发生错误的时候,以前代码中的一些错误处理的代码将无法被触发。 因为在 PHP 7 版本中,已经使用抛出异常的错误处理机制了。 (如果代码中没有捕获 Error 异常,那么会引发致命错误)。set_error_handle不一定接收的是异常,有可能是错误。

ERROR层级结构
  1. interface Throwable    |- Exception implements Throwable        |- ...    |- Error implements Throwable        |- TypeError extends Error        |- ParseError extends Error        |- AssertionError extends Error        |- ArithmeticError extends Error            |- DivisionByZeroError extends ArithmeticError
复制代码
  1. function handler(Exception $e) { ... }set_exception_handler('handler');// 兼容 PHP 5 和 7function handler($e) { ... }// 仅支持 PHP 7function handler(Throwable $e) { ... }
复制代码
2. list
list 会按照原来的顺序进行赋值。不再是逆序了
  1. list($a,$b,$c) = [1,2,3];var_dump($a);//1var_dump($b);//2var_dump($c);//3
复制代码
list不再支持解开字符串、

3. foreach不再改变内部数组指针
  1. <?php$array = [0, 1, 2];foreach ($array as &$val) {    var_dump(current($array));}?>#php 5int(1)int(2)bool(false)#php7int(0)int(0)int(0)
复制代码
4. 十六进制字符串不再被认为是数字
  1. var_dump("0x123" == "291");#php5true#php7false
复制代码
5.$HTTP_RAW_POST_DATA 被移
$HTTP_RAW_POST_DATA 被移 使用php://input代替

6. 移除了 ASP 和 script PHP 标签
开标签

闭标签


<%%>
<%=%>
<script language="php"></script>
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

浅生Lv.8 发表于 2020-7-7 08:55:38 | 查看全部
PHP7.1新特性1. 可为空(Nullable)类型
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是null
  1. #php5function($a = null){if($a===null) {return null;  }return $a;}#php7+function fun() :?string{return null;}function fun1(?$a){  var_dump($a);}fun1(null);//nullfun1('1');//1
复制代码
2. void 类型
返回值声明为 void 类型的方法要么干脆省去 return 语句。对于 void来说,NULL 不是一个合法的返回值。
  1. function fun() :void{echo "hello world";}
复制代码
3. 类常量可见性
  1. class Something{const PUBLIC_CONST_A = 1;public const PUBLIC_CONST_B = 2;protected const PROTECTED_CONST = 3;private const PRIVATE_CONST = 4;}
复制代码
4. iterable 伪类
这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象.
  1. function iterator(iterable $iter){foreach ($iter as $val) {//    }}
复制代码
5. 多异常捕获处理
一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用
  1. try {// some code} catch (FirstException | SecondException $e) {// handle first and second exceptions}
复制代码
6. list支持键名
  1. $data = [    ["id" => 1, "name" => 'Tom'],    ["id" => 2, "name" => 'Fred'],];// list() stylelist("id" => $id1, "name" => $name1) = $data[0];var_dump($id1);//1
复制代码
7. 字符串支持负向
  1. $a= "hello";$a[-2];//l
复制代码
8. 将callback 转闭包
Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。
  1. <?phpclass Test{public function exposeFunction(){return Closure::fromCallable([$this, 'privateFunction']);    }private function privateFunction($param){        var_dump($param);    }}$privFunc = (new Test)->exposeFunction();$privFunc('some value');
复制代码
9. http2 服务推送
对http2服务器推送的支持现在已经被加入到 CURL 扩展

PHP7.1变更
1. 传递参数过少时将抛出错误
过去我们传递参数过少 会产生warning。php7.1开始会抛出error

2. 移除了ext/mcrypt拓展
我要说一句 收起回复
AI智能体Lv.7 发表于 2025-3-17 03:12:11 | 查看全部
PHP 7.0 到 PHP 7.3 的版本更新带来了许多新特性和改进,这些变化不仅提升了语言的性能,还增强了开发者的编程体验。以下是对这些版本中新特性和变更的详细汇总:

### PHP 7.0 新特性

1. **组合比较符 (<=>)**
   - 用于比较两个表达式,返回 -1、0 或 1,分别表示小于、等于或大于。
   - 示例:`var_dump('PHP' <=> 'Node'); // int(1)`

2. **Null 合并运算符 (??)**
   - 简化了同时使用三元表达式和 `isset()` 的情况。
   - 示例:`$a = $_GET['a'] ?? 'none';`

3. **变量类型声明**
   - 支持强制和严格模式,允许使用 `int`、`string`、`float`、`bool` 等类型。
   - 示例:`function sumOfInts(int ...$ints) { return array_sum($ints); }`

4. **返回值类型声明**
   - 允许在函数定义后指定返回类型。
   - 示例:`function fun(int $a): array { return $a; }`

5. **匿名类**
   - 允许使用 `new class {}` 创建匿名对象。
   - 示例:`$util->setLogger(new class { public function log($msg) { echo $msg; } });`

6. **Unicode codepoint 转译语法**
   - 支持以 16 进制形式转译 Unicode codepoint。
   - 示例:`echo "\u{aa}"; // a`

7. **Closure::call**
   - 允许临时绑定闭包到对象并调用。
   - 示例:`echo $getX->call(new A);`

8. **带过滤的 unserialize**
   - 提供更安全的方式解包不可靠的数据。
   - 示例:`$data = unserialize($foo, ['allowed_classes' => ['MyClass', 'MyClass2']]);`

9. **IntlChar 类**
   - 提供操作多字符集 Unicode 字符的静态方法。
   - 示例:`echo IntlChar::charName('@');`

10. **预期 (Assertions)**
    - 允许在生产环境中启用断言为零成本,并在断言失败时抛出特定异常。
    - 示例:`assert(false, new CustomError('Some error message'));`

11. **命名空间按组导入**
    - 支持从同一命名空间下按组导入类、函数、常量。
    - 示例:`use app\model\{A, B};`

12. **生成器支持返回表达式**
    - 允许在生成器函数中使用 `return` 返回表达式。
    - 示例:`echo $gen->getReturn();`

13. **生成器委派**
    - 允许生成器委派给其他生成器。
    - 示例:`yield from gen2();`

14. **整数除法函数 intdiv**
    - 提供整数除法功能。
    - 示例:`var_dump(intdiv(10, 3)); // 3`

15. **会话选项设置**
    - 允许在 `session_start()` 中使用数组覆盖 `php.ini` 配置。
    - 示例:`session_start(['cache_limiter' => 'private']);`

16. **preg_replace_callback_array**
    - 允许使用关联数组对每个正则表达式注册回调函数。
    - 示例:`preg_replace_callback_array($regexesAndCallbacks, $input);`

### PHP 7.1 新特性

1. **可为空类型**
   - 允许在类型声明前加上 `?` 表示可为空。
   - 示例:`function testReturn(): ?string { return null; }`

2. **Void 返回类型**
   - 允许函数声明为 `void` 表示不返回任何值。
   - 示例:`function testReturn(): void { return; }`

3. **类常量可见性**
   - 允许为类常量设置可见性。
   - 示例:`class ConstDemo { public const PUBLIC_CONST = 'public'; }`

4. **多 catch 异常处理**
   - 允许在一个 `catch` 块中捕获多个异常。
   - 示例:`catch (ExceptionType1 | ExceptionType2 $e) { ... }`

5. **list() 支持键名**
   - 允许在 `list()` 中使用键名。
   - 示例:`list('a' => $a, 'b' => $b) = ['a' => 1, 'b' => 2];`

6. **支持为负的字符串偏移量**
   - 允许使用负的字符串偏移量。
   - 示例:`echo 'abcdef'[-2]; // e`

7. **异步信号处理**
   - 允许异步处理信号。
   - 示例:`pcntl_async_signals(true);`

8. **HTTP/2 服务器推送**
   - 支持 HTTP/2 服务器推送。
   - 示例:`header('Link: </style.css>; rel=preload; as=style', false);`

### PHP 7.2 新特性

1. **新的对象类型**
   - 引入了 `object` 类型。
   - 示例:`function test(object $obj): object { return $obj; }`

2. **通过名称加载扩展**
   - 允许通过名称加载扩展。
   - 示例:`dl('my_extension.so');`

3. **允许重写抽象方法**
   - 允许在子类中重写抽象方法。
   - 示例:`abstract class A { abstract function test(); } class B extends A { function test() { ... } }`

4. **使用 `Argon2` 算法生成密码散列**
   - 引入了 `Argon2` 算法作为密码散列算法。
   - 示例:`password_hash('password', PASSWORD_ARGON2I);`

5. **扩展的字符串类型提示**
   - 允许在类型提示中使用 `string` 类型。
   - 示例:`function test(string $str): string { return $str; }`

6. **允许 `__toString()` 抛出异常**
   - 允许 `__toString()` 方法抛出异常。
   - 示例:`class A { public function __toString() { throw new Exception(); } }`

7. **改进的 `count()` 函数**
   - 改进了 `count()` 函数对不可数对象的处理。
   - 示例:`count(new stdClass); // 1`

### PHP 7.3 新特性

1. **灵活的 Heredoc 和 Nowdoc 语法**
   - 允许在 Heredoc 和 Nowdoc 中使用缩进。
   - 示例:
   
  1. echo <<<EOD
  2.          a
  3.          b
  4.          c
  5.      EOD;
复制代码


2. **支持在 `list()` 中使用引用**
   - 允许在 `list()` 中使用引用。
   - 示例:`list($a, &$b) = [1, 2];`

3. **改进的 `json_encode()` 和 `json_decode()`**
   - 增加了对 JSON 编码和解码的改进。
   - 示例:`json_encode($data, JSON_THROW_ON_ERROR);`

4. **支持 `is_countable()` 函数**
   - 增加了 `is_countable()` 函数用于检查变量是否可数。
   - 示例:`if (is_countable($var)) { ... }`

5. **支持 `array_key_first()` 和 `array_key_last()`**
   - 增加了获取数组第一个和最后一个键的函数。
   - 示例:`array_key_first($array);`

6. **支持 `mb_str_split()` 函数**
   - 增加了按多字节字符分割字符串的函数。
   - 示例:`mb_str_split('こんにちは');`

7. **支持 `net_get_interfaces()` 函数**
   - 增加了获取网络接口信息的函数。
   - 示例:`net_get_interfaces();`

8. **支持 `hrtime()` 函数**
   - 增加了高精度时间函数。
   - 示例:`hrtime(true);`

这些新特性和改进使得 PHP 7.x 系列在性能、安全性和开发体验上都有了显著的提升。开发者可以根据项目需求选择合适的 PHP 版本,并充分利用这些新特性来提升代码质量和性能。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.144.115.82,GMT+8, 2025-3-31 06:54 , Processed in 0.472364 second(s), 92 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表