📜  PHP 7 有什么新变化?

📅  最后修改于: 2022-05-13 01:54:10.642000             🧑  作者: Mango

PHP 7 有什么新变化?

先决条件: PHP 7 |功能集 1

PHP 5 出现了许多次要版本,一路上令人兴奋,包括提供面向对象编程和许多与之相关的功能。

那么,为什么是 7 而不是 6?
几乎所有考虑用于PHP 6 的功能最终都在PHP 5.3 中执行并获得成功,因此没有遗漏任何内容。最终,提出了一种新的功能请求方式。当为重要版本设置的特征被接受时,为了避免混淆,它跳到最新版本的第 7 版。

是什么让PHP 7 与众不同?
PHP 7 的速度和性能变得更好PHP代码库使用更少的内存,开发了一个更快的引擎,话虽如此,让我们来看看这个包中添加了什么

  • 使用define()的常量数组: PHP数组常量可以通过define()函数来定义。在PHP 5.6 中它由 const 关键字定义。
    
    
    输出:

    Geeks
    
  • Unicode 转义: PHP 7.0.0 引入了“Unicode 代码点转义”。它使用十六进制形式的 Unicode 代码点并将该代码点以 UTF-8 格式输出到双引号字符串。允许任何合法的代码点,包括开始 0 是任意的。因此,可以通过使用双引号或heredoc字符串有效地编写Unicode字符,而无需调用函数。
    
    
    输出:
    ªª�
    

    以前也可以进行字符转义,但使用PHP 7 就容易多了。在字符串包含 Unicode 没有任何麻烦。

    
    
    输出:
    You owe me £500.
    

    在这个例子中,存在标准的 A 到 Z 和 0 到 9 个正在使用的字符。但它确实包含一个特殊字符英镑符号 (£)。早些时候,有必要对这些字符进行转义,否则会在字符串产生其字符代码 163。所以输出可能看起来像 163500 或类似的东西。这将是一场噩梦,因此我们每次都必须转义英镑符号,否则会导致错误。
    那么如何使用Unicode转义呢? Unicode 做法是用十六进制来定义数,看看结果

    // Write PHP code
    echo 'You owe me \u{A3}500.';
    

    这也将正确呈现:

    你欠我 500 英镑。

    因此,反斜杠 u 和大括号 (\u{}) 是在字符串插入 Unicode 十六进制字符的基本语法。

  • Filtered Unserialize():此功能用于在对不受信任的数据上的对象进行反序列化时提供更好的安全性。它可以防止代码注入。安全性对我们来说非常重要,它为来自未知来源或不受信任的数据提供更好的反序列化对象,从而使开发人员能够将可以反序列化的类列入白名单。它接受一个序列化的变量并返回一个PHP值。
    obj1var = 10;
      
    $obj2 = new B();
    $obj2->obj2var = 20;
      
    $serializedOb1 = serialize($obj1);
    $serializedOb2 = serialize($obj2);
       
    // If allowed_classes is passed as
    // false, unserialize transforms
    // every all objects in
    // __PHP_Incomplete_Class object
    $data = unserialize($serializedOb1,
             ["allowed_classes" => true]);
        
    // Converts all objects into 
    // __PHP_Incomplete_Class object
    // except those of A and B
    $data2 = unserialize($serializedOb2, 
         ["allowed_classes" => ["A", "B"]]);
        
    print($data->obj1var);
    print("
    "); print($data2->obj2var);    ?>
    输出:
    1020
    
  • 组使用声明: PHP 7 在PHP命名空间中实现了组的概念。这是PHP 7 中命名空间的极好补充之一。它们更直接,并且可以更简单地以紧凑的方式导入类、常量和函数。组使用声明提供了从标准命名空间导入多个结构的能力,并在大多数情况下减少了一个很好的冗长水平。组使用声明使识别属于等效模块的各种导入实体变得更简单。
  • 期望:我们都有某些假设,但并非所有这些假设都是事实。假设是基于逻辑和预感,但它并没有将它们视为事实。这些假设在您看来似乎合乎逻辑,但它们应该由代码支持,以保护处理完整性。期望意味着对旧的 assert()函数的向后兼容改进。如果断言默认,它提供了投射自定义异常的能力。 assert() 第一个参数是一个表达式,而不是要检查的字符串或布尔值。
     600, new CustomError(
            "Assumed num was greater than 600"));
      
    ?>
    
    输出:
    1
    
  • 会话选项: PHP 7 引入了 session_start() 以允许覆盖经常在PHP.ini 中设置的配置指令的选项数组。
    例如,指令 session.cache_expire 是 180,但假设我想要比这更长的时间,以便我的缓存在特定会话中过期。
    // Write PHP code
    session_start( [
        cache_expire => 380
    ] );
    

    现在不必通过重新配置服务器设置来更改此选项。

  • 生成器返回表达式: PHP 5.5 引入了生成器函数,其中包含产量值,并且 return 语句必须是其中的最后一个语句。
    // Write PHP code
    function genA() {
        yield 20;
        yield 30;
        yield 40;
        return 50;
    }
    

    根据PHP手册,“生成器函数看起来像一个普通函数,只是生成器不返回值,而是生成所需数量的值。任何包含 yield 的函数都是“生成器”函数。它可以迭代和检索值,但如果试图从中返回任何内容,则会引发错误。

    getReturn(); 
      
    ?>
    
    输出:
    100
    400
    900
    1600
    2500
    Done calculating the square.
    
  • 生成器委托:在PHP 7 中,生成器委托是来自另一个生成器、可遍历对象或使用 yield from 关键字的数组的 yield 值。然后外部生成器将产生来自内部生成器、对象或数组的所有值,直到它们不再有效,之后将在外部生成器中继续执行。如果生成器与 yield from 一起使用,则 yield from 表达式还将返回内部生成器返回的任何值。
    
    
    输出:
    1
    4
    9
    16
    25
    0
    0
    0
    0
    0
    

参考文献:http:// PHP.NET /手动/ EN / migration70.new的功能。 PHP