i漂泊

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2026|回复: 1

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

[复制链接]
TA的礼物信息
  • 收到:0
  • 送出:2
发表于 2019-7-4 10:57:31 | 显示全部楼层 |阅读模式
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)
  2. var_dump(123 <=> 456); // int(-1)
  3. var_dump(['a', 'b'] <=> ['a', 'b']); // int(0)
复制代码
2. null合并运算符
由于日常使用中存在大量同时使用三元表达式和isset操作。使用null合并运算符可以简化操作


  1. # php7以前
  2. if(isset($_GET['a'])) {
  3.   $a = $_GET['a'];
  4. }
  5. # php7以前
  6. $a = isset($_GET['a']) ? $_GET['a'] : 'none';

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

同时不能再使用int、string、float、bool作为类的名字了

  1. function sumOfInts(int ...$ints)
  2. {
  3. return array_sum($ints);
  4. }
  5. ar_dump(sumOfInts(2, '3', 4.1)); // int(9)
  6. # 严格模式
  7. declare(strict_types=1);

  8. function add(int $x, int $y)
  9. {
  10. return $x + $y;
  11. }
  12. 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
  2. {
  3. return $a;
  4. }
  5. fun(3);//Fatal error
复制代码
6. 匿名类
php7允许new class {} 创建一个匿名的对象。
  1. //php7以前
  2. class Logger
  3. {
  4. public function log($msg)
  5. {
  6. echo $msg;
  7.     }
  8. }

  9. $util->setLogger(new Logger());

  10. // php7+
  11. $util->setLogger(new class {
  12. public function log($msg)
  13. {
  14. echo $msg;
  15.     }
  16. });
复制代码
7. Unicode codepoint 转译语法
这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的
  1. echo "\u{aa}";// a
  2. echo "\u{0000aa}";// a
  3. echo "\u{9999}";// 香
复制代码
8. Closure::call
闭包绑定 简短干练的暂时绑定一个方法到对象上闭包并调用它。
  1. class A {private $x = 1;}

  2. // PHP 7 之前版本的代码
  3. $getXCB = function() {return $this->x;};
  4. $getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
  5. echo $getX();

  6. // PHP 7+ 及更高版本的代码
  7. $getX = function() {return $this->x;};
  8. echo $getX->call(new A);
复制代码
9. 带过滤的unserialize
提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入
  1. // 将所有的对象都转换为 __PHP_Incomplete_Class 对象
  2. $data = unserialize($foo, ["allowed_classes" => false]);

  3. // 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
  4. $data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);

  5. // 默认情况下所有的类都是可接受的,等同于省略第二个参数
  6. $data = unserialize($foo, ["allowed_classes" => true]);
复制代码
10. IntlChar类
这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。需要安装intl拓展
  1. printf('%x', IntlChar::CODEPOINT_MAX);
  2. echo IntlChar::charName('@');
  3. var_dump(IntlChar::ispunct('!'));
复制代码
11. 预期
它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。以后可以使用这个这个进行断言测试
  1. ini_set('assert.exception', 1);

  2. class CustomError extends AssertionError {}

  3. assert(false, new CustomError('Some error message'));
复制代码
12. 命名空间按组导入
从同一个命名空间下导入的类、函数、常量支持按组一次导入
  1. #php7以前
  2. use app\model\A;
  3. use app\model\B;
  4. #php7+
  5. use app\model{A,B}
复制代码
13.生成器支持返回表达式
它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。
  1. $gen = (function() {
  2. yield 1;
  3. yield 2;

  4. return 3;
  5. })();

  6. foreach ($gen as $val) {
  7. echo $val, PHP_EOL;
  8. }

  9. echo $gen->getReturn(), PHP_EOL;
  10. # output
  11. //1
  12. //2
  13. //3
复制代码
14.生成器委派
现在,只需在最外层生成其中使用yield from,就可以把一个生成器自动委派给其他的生成器
  1. function gen()
  2. {
  3. yield 1;
  4. yield 2;

  5. yield from gen2();
  6. }

  7. function gen2()
  8. {
  9. yield 3;
  10. yield 4;
  11. }

  12. foreach (gen() as $val)
  13. {
  14. echo $val, PHP_EOL;
  15. }
复制代码
15.整数除法函数intdiv
  1. var_dump(intdiv(10,3)) //3
复制代码
16.会话选项设置
session_start() 可以加入一个数组覆盖php.ini的配置
  1. session_start([
  2. 'cache_limiter' => 'private',
  3. 'read_and_close' => true,
  4. ]);
复制代码
17. preg_replace_callback_array
可以使用一个关联数组来对每个正则表达式注册回调函数, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值
  1. string preg_replace_callback_array(array $regexesAndCallbacks, string $input);
  2. $tokenStream = []; // [tokenName, lexeme] pairs

  3. $input = <<<'end'
  4. $a = 3; // variable initialisation
  5. end;

  6. // Pre PHP 7 code
  7. preg_replace_callback(
  8.     [
  9. '~\$[a-z_][a-z\d_]*~i',
  10. '~=~',
  11. '~[\d]+~',
  12. '~;~',
  13. '~//.*~'
  14.     ],
  15. function ($match) use (&$tokenStream) {
  16. if (strpos($match[0], '18. 随机数、随机字符函数[code]string random_bytes(int length);
  17. int random_int(int min, int max);
复制代码
19. define 支持定义数组
  1. #php7+
  2. 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
  2.     |- Exception implements Throwable
  3.         |- ...
  4.     |- Error implements Throwable
  5.         |- TypeError extends Error
  6.         |- ParseError extends Error
  7.         |- AssertionError extends Error
  8.         |- ArithmeticError extends Error
  9.             |- DivisionByZeroError extends ArithmeticError
复制代码
  1. function handler(Exception $e) { ... }
  2. set_exception_handler('handler');

  3. // 兼容 PHP 5 和 7
  4. function handler($e) { ... }

  5. // 仅支持 PHP 7
  6. function handler(Throwable $e) { ... }
复制代码
2. list
list 会按照原来的顺序进行赋值。不再是逆序了
  1. list($a,$b,$c) = [1,2,3];
  2. var_dump($a);//1
  3. var_dump($b);//2
  4. var_dump($c);//3
复制代码
list不再支持解开字符串、

3. foreach不再改变内部数组指针
  1. <?php
  2. $array = [0, 1, 2];
  3. foreach ($array as &$val) {
  4.     var_dump(current($array));
  5. }
  6. ?>
  7. #php 5
  8. int(1)
  9. int(2)
  10. bool(false)
  11. #php7
  12. int(0)
  13. int(0)
  14. int(0)
复制代码
4. 十六进制字符串不再被认为是数字
  1. var_dump("0x123" == "291");
  2. #php5
  3. true
  4. #php7
  5. false
复制代码
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);
  2. int random_int(int min, int max);
复制代码
19. define 支持定义数组
  1. #php7+
  2. 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
  2.     |- Exception implements Throwable
  3.         |- ...
  4.     |- Error implements Throwable
  5.         |- TypeError extends Error
  6.         |- ParseError extends Error
  7.         |- AssertionError extends Error
  8.         |- ArithmeticError extends Error
  9.             |- DivisionByZeroError extends ArithmeticError
复制代码
  1. function handler(Exception $e) { ... }
  2. set_exception_handler('handler');

  3. // 兼容 PHP 5 和 7
  4. function handler($e) { ... }

  5. // 仅支持 PHP 7
  6. function handler(Throwable $e) { ... }
复制代码
2. list
list 会按照原来的顺序进行赋值。不再是逆序了
  1. list($a,$b,$c) = [1,2,3];
  2. var_dump($a);//1
  3. var_dump($b);//2
  4. var_dump($c);//3
复制代码
list不再支持解开字符串、

3. foreach不再改变内部数组指针
  1. &lt;?php
  2. $array = [0, 1, 2];
  3. foreach ($array as &amp;$val) {
  4.     var_dump(current($array));
  5. }
  6. ?&gt;
  7. #php 5
  8. int(1)
  9. int(2)
  10. bool(false)
  11. #php7
  12. int(0)
  13. int(0)
  14. int(0)
复制代码
4. 十六进制字符串不再被认为是数字
  1. var_dump("0x123" == "291");
  2. #php5
  3. true
  4. #php7
  5. false
复制代码
5.$HTTP_RAW_POST_DATA 被移
$HTTP_RAW_POST_DATA 被移 使用php://input代替

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

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

回复

使用道具 举报

TA的礼物信息
  • 收到:0
  • 送出:2
 楼主| 发表于 2019-7-4 11:01:49 | 显示全部楼层
PHP7.1新特性1. 可为空(Nullable)类型
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是null
  1. #php5
  2. function($a = null){
  3. if($a===null) {
  4. return null;
  5.   }
  6. return $a;
  7. }
  8. #php7+
  9. function fun() :?string
  10. {
  11. return null;
  12. }

  13. function fun1(?$a)
  14. {
  15.   var_dump($a);
  16. }
  17. fun1(null);//null
  18. fun1('1');//1
复制代码
2. void 类型
返回值声明为 void 类型的方法要么干脆省去 return 语句。对于 void来说,NULL 不是一个合法的返回值。
  1. function fun() :void
  2. {
  3. echo "hello world";
  4. }
复制代码
3. 类常量可见性
  1. class Something
  2. {
  3. const PUBLIC_CONST_A = 1;
  4. public const PUBLIC_CONST_B = 2;
  5. protected const PROTECTED_CONST = 3;
  6. private const PRIVATE_CONST = 4;
  7. }
复制代码
4. iterable 伪类
这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象.
  1. function iterator(iterable $iter)
  2. {
  3. foreach ($iter as $val) {
  4. //
  5.     }
  6. }
复制代码
5. 多异常捕获处理
一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用
  1. try {
  2. // some code
  3. } catch (FirstException | SecondException $e) {
  4. // handle first and second exceptions
  5. }
复制代码
6. list支持键名
  1. $data = [
  2.     ["id" => 1, "name" => 'Tom'],
  3.     ["id" => 2, "name" => 'Fred'],
  4. ];

  5. // list() style
  6. list("id" => $id1, "name" => $name1) = $data[0];
  7. var_dump($id1);//1
复制代码
7. 字符串支持负向
  1. $a= "hello";
  2. $a[-2];//l
复制代码
8. 将callback 转闭包
Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。
  1. <?php
  2. class Test
  3. {
  4. public function exposeFunction()
  5. {
  6. return Closure::fromCallable([$this, 'privateFunction']);
  7.     }

  8. private function privateFunction($param)
  9. {
  10.         var_dump($param);
  11.     }
  12. }

  13. $privFunc = (new Test)->exposeFunction();
  14. $privFunc('some value');
复制代码
9. http2 服务推送
对http2服务器推送的支持现在已经被加入到 CURL 扩展

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

2. 移除了ext/mcrypt拓展


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|IPiaoBo Inc. ( 渝ICP备17002826号 )

GMT+8, 2024-3-29 04:33 , Processed in 0.072834 second(s), 47 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表