一起看看php7新特性

互联网 20-6-22

1、PHP 标量类型与返回值类型声明

2、PHP NULL 合并运算符

3、PHP 太空船运算符(组合比较符)

4、PHP 常量数组

5、PHP 匿名类

6、PHP Closure::call()

7、PHP 过滤 unserialize()

8、PHP IntlChar()

9、PHP CSPRNG

10、PHP 7 异常

11、PHP 7 use 语句

12、PHP 7 错误处理

13、PHP intp() 函数

14、PHP 7 Session 选项

15、PHP 7 废弃特性

16、PHP 7 移除的扩展

17、PHP 7 移除的 SAPI

PHP 标量类型与返回值类型声明

  • 标量类型声明

    强制模式

declare(strict_types=1)   <?php  // 强制模式  function sum(int ...$ints)  {     return array_sum($ints);  }  print(sum(2, '3', 4.1));  ?>  以上程序执行输出结果为:  9复制代码
  • 严格模式

<?php   declare(strict_types=1);   function sum(int ...$ints)  {     return array_sum($ints);  }   print(sum(2, '3', 4.1));  ?> 以上程序由于采用了严格模式,所以如果参数中出现不适整数的类型会报错,执行输出结果为:  PHP Fatal error:  Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……复制代码

PHP NULL 合并运算符

  • 以前的三元运算

  $site = isset($_GET['site']) ? $_GET['site'] : '菜鸟教程';复制代码
  • 现在的合并运算符

  $site = $_GET['site'] ?? '菜鸟教程';复制代码
  • 以上2种方法是一样的

  • 以下是实例:

    <?php // 获取 $_GET['site'] 的值,如果不存在返回 '高压锅'$site = $_GET['site'] ?? '高压锅';print($site);print(PHP_EOL); // PHP_EOL 为换行符   // 以上代码等价于$site = isset($_GET['site']) ? $_GET['site'] : '高压锅';print($site);print(PHP_EOL); // ?? 链$site = $_GET['site'] ?? $_POST['site'] ?? '高压锅';print($site); ?>复制代码

组合比较符,又称太空船运算符

PHP 7 新增加的太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1。

以下是实例

<?php // 整型比较print( 1 <=> 1);print(PHP_EOL);print( 1 <=> 2);print(PHP_EOL);print( 2 <=> 1);print(PHP_EOL);print(PHP_EOL); // PHP_EOL 为换行符  // 浮点型比较print( 1.5 <=> 1.5);print(PHP_EOL);print( 1.5 <=> 2.5);print(PHP_EOL);print( 2.5 <=> 1.5);print(PHP_EOL);print(PHP_EOL);  // 字符串比较print( "a" <=> "a");print(PHP_EOL);print( "a" <=> "b");print(PHP_EOL);print( "b" <=> "a");print(PHP_EOL); ?>复制代码
    以上结果分别为复制代码
0 -1 1  0 -1 1  0 -1 1复制代码

PHP 常量数组

  • 以前定义常量数组 只能有 const;

  • 现在定义常量数组可以使用 define();

以下是实例:

// 使用 define 函数来定义数组 define('sites', [   'Google',   'Runoob',   'Taobao']);print(sites[1]); ?> 以上程序执行输出结果为:  Runoob复制代码

PHP 匿名类

  • PHP 7 支持通过 new class 来实例化一个匿名类,这可以用来替代一些"用后即焚"的完整类定义。

  • 以下是实例:

        <?php          interface Logger {             public function log(string $msg);          }                   class Application {             private $logger;                      public function getLogger(): Logger {                return $this->logger;             }                      public function setLogger(Logger $logger) {                $this->logger = $logger;             }            }                   $app = new Application;          // 使用 new class 创建匿名类          $app->setLogger(new class implements Logger {             public function log(string $msg) {                print($msg);             }          });           $app->getLogger()->log("我的第一条日志");          ?> 以上程序执行输出结果为:  我的第一条日志复制代码

php Closure::call()

  • PHP 7 的 Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。

实例 <?php  class A {      private $x = 1;  }   // PHP 7 之前版本定义闭包函数代码  $getXCB = function() {      return $this->x;  };   // 闭包函数绑定到类 A 上  $getX = $getXCB->bindTo(new A, 'A');    echo $getX();  print(PHP_EOL);   // PHP 7+ 代码  $getX = function() {      return $this->x;  };  echo $getX->call(new A);  ?> 以上程序执行输出结果为: 1 1复制代码

PHP 过滤 unserialize()

  • PHP 7 增加了可以为 unserialize() 提供过滤的特性,可以防止非法数据进行代码注入,提供了更安全的反序列化数据。

实例 <?php  class MyClass1 {      public $obj1prop;     }  class MyClass2 {     public $obj2prop;  }    $obj1 = new MyClass1();  $obj1->obj1prop = 1;  $obj2 = new MyClass2();  $obj2->obj2prop = 2;   $serializedObj1 = serialize($obj1);  $serializedObj2 = serialize($obj2);   // 默认行为是接收所有类  // 第二个参数可以忽略  // 如果 allowed_classes 设置为 false, unserialize 会将所有对象转换为 __PHP_Incomplete_Class 对象  $data = unserialize($serializedObj1 , ["allowed_classes" => true]);   // 转换所有对象到 __PHP_Incomplete_Class 对象,除了 MyClass1 和 MyClass2  $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);   print($data->obj1prop);  print(PHP_EOL);  print($data2->obj2prop);  ?> 以上程序执行输出结果为: 1 2复制代码

注意 以上特性是unserialize()里面多了一个参数选择 allowed_classes

PHP CSPRNG 伪随机数生成器

  • CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,伪随机数产生器)。

  • PHP 7 通过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。

random_bytes() - 加密生存被保护的伪随机字符串。

random_int() - 加密生存被保护的伪随机整数。

  • 综上 类似于原先的 rand() 和 'mt_rand()'; 只不过 现在random_bytes()生成的是随机字符串

php7 异常

  • PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。

  • 老版本的API出于兼容目的将继续被维护。

  • assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。

assert()的应用  跟assert_option() 配合复制代码

还有参数类型

配置项默认值可选值
zend.assertions11.生成和执行代码 (开发模式) 0.生成代码,但在执行时跳过它-1.不生成代码 (生产环境)
assert.exception0
**参数** assertion 断言。在 PHP 5 中,是一个用于执行的字符串或者用于测试的布尔值。在 PHP 7 中,可以是一个返回任何值的表达式, 它将被执行结果用于指明断言是否成功。 description 如果 assertion 失败了,选项 description 将会包括在失败信息里。 exception 在 PHP 7 中,第二个参数可以是一个 Throwable 对象,而不是一个字符串,如果断言失败且启用了 assert.exception 该对象将被抛出  实例 将 zend.assertions 设置为 0: 实例 <?php  ini_set('zend.assertions', 0);   assert(true == false);  echo 'Hi!';  ?> 以上程序执行输出结果为: Hi! 将 zend.assertions 设置为 1,assert.exception 设置为 1: 实例 <?php  ini_set('zend.assertions', 1);  ini_set('assert.exception', 1);   assert(true == false);  echo 'Hi!';  ?> 以上程序执行输出结果为: Fatal error: Uncaught AssertionError: assert(true == false) in -:2 Stack trace:#0 -(2): assert(false, 'assert(true == ...')#1 {main}   thrown in - on line 2复制代码

PHP 7 use 语句

  • PHP 7 可以使用一个 use 从同一个 namespace 中导入类、函数和常量:

// PHP 7 之前版本需要使用多次 use  use some\namespace\ClassA;  use some\namespace\ClassB;  use some\namespace\ClassC as C;  use function some\namespace\fn_a;  use function some\namespace\fn_b;  use function some\namespace\fn_c;  use const some\namespace\ConstA;  use const some\namespace\ConstB;  use const some\namespace\ConstC;  // PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类  use some\namespace\{ClassA, ClassB, ClassC as C};  use function some\namespace\{fn_a, fn_b, fn_c};  use const some\namespace\{ConstA, ConstB, ConstC};  ?>

推荐教程:《php教程》

以上就是一起看看php7新特性的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: Markdown
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:php7中使用xhprof解析

相关资讯