zoukankan      html  css  js  c++  java
  • PHP 7新特性


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

    示例:要求参数为整型,返回结果为整数,不符合会报错。
    declare(strict_types=1);//设置严格模式

    function returnIntValue(int $value): int
    {
    return $value;
    }

    print(returnIntValue(5));


    (2) PHP NULL 合并运算符

    PHP 7 新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式。

    NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二个操作数

    示例:

    以前需要
    $site = isset($_GET['site']) ? $_GET['site'] : '菜鸟教程';
    现在:
    $site = $_GET['site'] ?? '菜鸟教程';


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

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

    示例:
    print( 1 <=> 2);
    结果为:-1


    (4) PHP 常量数组

    在 PHP 5.6 中仅能通过 const 定义常量数组,PHP 7 可以通过 define() 来定义。

    示例:
    // 使用 define 函数来定义数组
    define('sites', [
    'Google',
    'Runoob',
    'Taobao'
    ]);

    print(sites[1]);


    (5)PHP 匿名类

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

    示例:

    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("我的第一条日志");


    (6)PHP Closure::call()

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

    示例:

    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);


    (7) 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 转换到 __PHP_Incomplete_Class
    $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

    print($data->obj1prop);//1
    print(PHP_EOL);
    print($data2->obj2prop);//2


    (8) PHP IntlChar()

    PHP 7 通过新的 IntlChar 类暴露出 ICU 中的 Unicode 字符特性。
    这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。

    示例:
    printf('%x', IntlChar::CODEPOINT_MAX);//10ffff
    echo IntlChar::charName('@');//COMMERCIAL AT
    var_dump(IntlChar::ispunct('!'));//bool(true)


    (9) PHP CSPRNG

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

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

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

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

    示例:
    $bytes = random_bytes(5);
    print(bin2hex($bytes));//6f36d48a29

    print(random_int(100, 999));//723
    print(PHP_EOL);
    print(random_int(-1000, 0));//-64


    扩展知识:
    bin2hex() 函数把 ASCII 字符的字符串转换为十六进制值。
    字符串可通过使用 pack() 函数再转换回去


    (10)PHP 7 异常

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

    老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。


    (11) PHP 7 use 语句

    PHP 7 可以使用一个 use 从同一个 namespace 中导入类、函数和常量
    示例:
    // PHP 7 之前版本需要使用多次 use
    use some amespaceClassA;
    use some amespaceClassB;
    use some amespaceClassC as C;

    // PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
    use some amespace{ClassA, ClassB, ClassC as C};


    (12) PHP 7 错误处理

    PHP 7 改变了大多数错误的报告方式。不同于 PHP 5 的传统错误报告机制,现在大多数错误被作为 Error 异常抛出。

    这种 Error 异常可以像普通异常一样被 try / catch 块所捕获。如果没有匹配的 try / catch 块,
    则调用异常处理函数(由 set_exception_handler() 注册)进行处理。
    如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

    Error 类并不是从 Exception 类 扩展出来的,所以用 catch (Exception $e) { ... } 这样的代码是捕获不
    到 Error 的。
    你可以用 catch (Error $e) { ... } 这样的代码,
    或者通过注册异常处理函数( set_exception_handler())来捕获 Error。


    (13)PHP intdiv() 函数

    PHP 7 新增加了 intdiv() 函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整。


    (14) PHP session_start() 函数

    PHP 7 session_start() 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session 的配置项。

    这个特性也引入了一个新的 php.ini 设置(session.lazy_write), 默认情况下设置为 true,
    意味着 session 数据只在发生变化时才写入。

    除了常规的会话配置指示项, 还可以在此数组中包含 read_and_close 选项。
    如果将此选项的值设置为 TRUE, 那么会话文件会在读取完毕之后马上关闭,
    因此,可以在会话数据没有变动的时候,避免不必要的文件锁。

    实例:
    把 cache_limiter 设置为私有的,同时在阅读完 session 后立即关闭
    <?php
    session_start([
      'cache_limiter' => 'private',
      'read_and_close' => true,
    ]);
    ?>


    (15) PHP 7 废弃特性

    1、在 PHP4 中类中的函数可以与类名同名,这一特性在 PHP7 中被废弃,
    当方法名与类名相同,且类不在命名空间中,
    同时PHP5的构造函数(__construct)不存在时,会产生一个 E_DEPRECATED 错误。.

    2、以静态的方式调用非静态方法,不再支持
    3、password_hash() 随机因子选项,函数原 salt 量不再需要由开发者提供了。
    函数内部默认带有 salt 能力,无需开发者提供 salt 值。
    4、capture_session_meta SSL 上下文选项
    废弃了 "capture_session_meta" SSL 上下文选项。
    在流资源上活动的加密相关的元数据可以通过 stream_get_meta_data() 的返回值访问


    (16)PHP 7 版本移除了以下扩展:

    ereg
    mssql
    mysql
    sybase_ct


    (17)PHP 7 版本移除的SAPI:

    aolserver

    apache

    apache_hooks

    apache2filter

    caudium

    continuity

    isapi

    milter

    nsapi

    phttpd

    pi3web

    roxen

    thttpd

    tux

    webjames


    这是 PHP 内核提供给外部调用其服务的接口,即外部系统可以通过 SAPI 来调用 PHP 提供的编译脚本、执行脚本的服务。

    PHP中常用的SAPI有cli、php-fpm,cli是命令行下执行PHP脚本的实现:bin/php script.php,它是单进程的,处理模型比较简单,而php-fpm相对比较复杂,它实现了网络处理模块,用于与web服务器交互。

    从下图可以较为清晰的理解外部系统是如何通过 SAPI 调用 PHP 服务的

    image


  • 相关阅读:
    LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
    UVA 10564 Paths through the Hourglass(背包)
    Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)
    UVALive 3530 Martian Mining(贪心,dp)
    UVALive 4727 Jump(约瑟夫环,递推)
    UVALive 4731 Cellular Network(贪心,dp)
    UVA Mega Man's Mission(状压dp)
    Aizu 2456 Usoperanto (贪心)
    UVA 11404 Plalidromic Subsquence (回文子序列,LCS)
    Aizu 2304 Reverse Roads(无向流)
  • 原文地址:https://www.cnblogs.com/gyfluck/p/13959508.html
Copyright © 2011-2022 走看看