zoukankan      html  css  js  c++  java
  • PHP7 新增特性

    一、性能与底层

    php7 最显著的变化就是性能的极大提升,PHP7速度是 PHP5.6 的两倍,PHP7在语言上也有一些变化,比如添加返回类型声明、增加了一些新的保留关键字等。在安全方面,去除了PHP安全模式,添加魔术引号等。

    二、新特性

    1、类型声明

    现在php的标量有两种模式: 强制 (默认) 和严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。在旧版中,函数的参数申明只能是(Array $arr)、(CLassName $obj)等,基本类型比如Int,String等是不能够被申明的。

    强制模式

    php7之前的使用方式:

    class MyInfo
    {
        public $a = 123;
        public function getInfo(array $a, $b)
        {
            var_dump($a, $b);
        }
    }
    
    function getClass(MyInfo $a) {
        var_dump($a->a);
    }

    强制模式会把数据转换为指定的数据类型

    php7使用方式:

    class MyInfo
    {
        public $a = 123;
    
        public function get1(bool $b)
        {
            var_dump($b);
        }
    
        public function get2(int $b)
        {
            var_dump($b);
        }
    
        public function get3(string $b)
        {
            var_dump($b);
        }
    
        public function get4(float $b)
        {
            var_dump($b);
        }
    
        public function get5(array $b)
        {
            var_dump($b);
        }
    }

    严格模式

    <?php
    declare(strict_types=1);

    就进入严格模式,参数必须符合规定(必须传入指定数据类型的值),不然报错。

    2、返回值类型

    php7之前的函数是没有返回值类型的,return啥类型,就是啥类型。

    php7中增加了返回值类型,return的类型可以是以下这些:bool、int、string、float、array、class。

    语法:

    function 函数名称() :  返回类型{
    
    }

    示例:

    function returnInfo ($a) : array {
        return $a;
    }
    
    var_dump(returnInfo([1,2,3]));

    3、null合并运算符 (??)

    如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

    示例:

    //php version = 7
    $username = $user ?? 'nobody';
    
    //php  version < 7 得这样使用:
    $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

    注意:

    $a ?: $b的意思是 $a为true时,直接返回$a, 否则返回$b

    $a ?? $b的意思是 $a isset($a)为true, 且不为NULL, 就返回$a, 否则返回$b。

    示例:

    $user = 0;
    
    $username = $user ?? 'nobody';
    
    echo $username;  //输出 0,因为 0 存在 且 不为NULL。
    
    $username = $user ?: 'nobody';
    
    echo $username; //输出 'nobody',因为 0 为 false

    4、组合比较符

    <=>用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。

    示例:

    // Integers
    
    echo 1 <=> 1; // 0
    
    echo 1 <=> 2; // -1
    
    echo 2 <=> 1; // 1
    
    // Floats
    
    echo 1.5 <=> 1.5; // 0
    
    echo 1.5 <=> 2.5; // -1
    
    echo 2.5 <=> 1.5; // 1
    
    // Strings
    
    echo "a" <=> "a"; // 0
    
    echo "a" <=> "b"; // -1
    
    echo "b" <=> "a"; // 1

    5、通过define()定义常量数组

     示例:

    define ('AWS' , [12,33,44,55]);

    6、匿名类

    现在已经支持通过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;
    
    $app->setLogger(new class implements Logger {
    
        public function log(string $msg) {
    
            echo $msg;
    
        }
    
    });
    
    var_dump($app->getLogger());

    7、Unicode codepoint 转译语法

    这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的。

    echo "u{0000aa}";
    
    echo "u{aa}"; //省略了开头的0
    
    echo "u{9999}";

    8、Closure::call() 闭包

    class A {private $x = 1;}
    
    // php 7之前:
    
    $getXCB = function() {return $this->x;};
    
    $getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
    
    echo $getX();
    
    // PHP 7:
    
    $getX = function() {return $this->x;};
    
    echo $getX->call(new A);

    9、为unserialize()提供过滤

    现在php7中unserialize会变得更佳好用,它多了一个参数,用来反序列化包涵class的过滤不需要的类,变的更加安全。

    10、IntlChar

    新增加的 IntlChar(http://php.net/manual/zh/class.intlchar.php) 类旨在暴露出更多的 ICU 功能。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。

    printf('%x', IntlChar::CODEPOINT_MAX);
    
    echo IntlChar::charName('@');
    
    var_dump(IntlChar::ispunct('!'));
  • 相关阅读:
    Linux2_软件源apt 仓库 包 的概念
    I2C(smbus pmbus)和SPI分析
    Linux1_发型版本(Debian RHEL)与软件包管理器(RPM dpkg)的概念
    ubuntu系统下如何切换输入法
    【NYOJ】[169]素数
    【杭电】[2020]绝对值排序
    【杭电】[2020]绝对值排序
    【NYOJ】[199]无线网络覆盖
    【NYOJ】[243]字母统计
    【NYOJ】[198]数数
  • 原文地址:https://www.cnblogs.com/yang-2018/p/14245467.html
Copyright © 2011-2022 走看看