• php7的新特性


    都知道吃别人嚼过的东西不香,那也得吃,总比饿着强。谁让自己的牙没长全(英语,计算机基础)。七拼八凑组合一下,加上自己的理解。重点还是要多看多学,哪怕一篇文章只吸取了那么一丁点的知识,也要自己加工,形成自己的知识体系。不要当吃瓜群众,囫囵吞枣的看一下,没过几天就忘了,文章是没少看,最后一无所获,回头来还要花同样的时间再次学习。

    null 合并运算符

    由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (_??_) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

    $name = isset($_GET['name']) ? $_GET['name'] : 'nobody';
    // 等价于 $_GET['name'] 存在且值不为NULL 就返回自身的值,否则为设置的值
    $name = $_GET['name'] ?? 'nobody';
    
    $a = null;
    $name = $a ?? 0; 
    echo $name ; // 输出 0

    太空操作符

    太空船操作符用于比较两个表达式。当小于、等于或大于b时它分别返回-1、0或1

    // 整数  
    echo 1 <=> 1; // 0  
    echo 1 <=> 2; // -1  
    echo 2 <=> 1; // 1  
      
    // 浮点数  
    echo 1.5 <=> 1.5; // 0  
    echo 1.5 <=> 2.5; // -1  
    echo 2.5 <=> 1.5; // 1  
       
    // 字符串  
    echo "a" <=> "a"; // 0  
    echo "a" <=> "b"; // -1  
    echo "b" <=> "a"; // 1

    通过 define() 定义常量数组

    Array 类型的常量现在可以通过 define() 来定义。在 php5.6 中仅能通过 const 定义。

    define("nba", [
        '湖人',
        '雷霆',
        '热火',
        '火箭'
    ]);
    
    print_r(nba); 
    
    // 输出 与数组的操作方式一样了
    // Array
    // (
    //     [0] => 湖人
    //     [1] => 雷霆
    //     [2] => 热火
    //     [3] => 火箭
    // )
    

    标量类型声明

    标量类型声明 有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (_int_), 浮点数 (float), 以及布尔值 (_bool_)。它们扩充了php5中引入的其他类型:类名,接口,数组和 回调类型。

    function testInt(int ...$ints) {
        return array_sum($ints);
    }
    
    function testString(string $a, string $b) {
        echo $a . $b . "
    ";
    }
    
    function testArr(array $arr) {
        print_r($arr);
    }

    匿名类

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

    interface Logger {
        public function log(string $msg);
    }
    
    class Application {
        
        private $logger;
    
        /**
         * 返回 logger
         *
         * @return Logger
         */
        public function getLogger(): Logger {
            $this->logger->log("abc");
            return $this->logger;
        }
    
        /**
         * 设置 logger 变量
         *
         * @param Logger $logger
         * @return void
         */
        public function setLogger(Logger $logger) {
            $this->logger = $logger;
        }
    }
    
    $app = new Application;
    $app->setLogger(new class implements Logger {
    
        /**
         * 匿名类实现 logger 的 log
         *
         * @param string $msg
         * @return void
         */
        public function log(string $msg) {
            echo sprintf("这是匿名函数实现的 log , msg=%s
    ", $msg);
        }
    });
    
    var_dump($app->getLogger());
    
    // 输出结果
    这是匿名函数实现的 log , msg=abc
    object(class@anonymous)#2 (0) {
    }

    Unicode codepoint 转译语法

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

    echo "u{aa}";
    echo "u{0000aa}";
    echo "u{9999}";

    输出结果

    ª
    ª (same as before but with optional leading 0's)
    香

    Closure::call()

    Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。

    class A {private $x = 100;}
    
    // PHP 7 之前版本的代码
    $getXCB = function() {return $this->x;};
    $getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
    echo $getX();
    
    // PHP 7+ 及更高版本的代码
    // 将匿名函数绑定到 A 类中,并且以匿名函数的身份调用
    $getX = function() {return $this->x;};
    echo $getX->call(new A);

    为unserialize()提供过滤

    // 将所有的对象都转换为 __PHP_Incomplete_Class 对象
    $data = unserialize($foo, ["allowed_classes" => false]);
    
    // 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
    $data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
    
    // 默认情况下所有的类都是可接受的,等同于省略第二个参数
    $data = unserialize($foo, ["allowed_classes" => true]);

    IntlChar

    printf('%x', IntlChar::CODEPOINT_MAX);
    echo IntlChar::charName('@');
    var_dump(IntlChar::ispunct('!'));

    以上例程会输出:

    10ffff
    COMMERCIAL AT
    bool(true)

    整数除法函数 intdiv()

    新加的函数 intdiv() 用来进行 整数的除法运算。

    var_dump(intdiv(10, 3));
    

    以上输出

    int(3)

    Group use declarations

    从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。

    // PHP 7 之前的代码
    use somenamespaceClassA;
    use somenamespaceClassB;
    use somenamespaceClassC as C;
    
    use function somenamespacefn_a;
    use function somenamespacefn_b;
    use function somenamespacefn_c;
    
    use const somenamespaceconstA;
    use const somenamespaceConstB;
    use const somenamespaceConstC;
    
    // PHP 7+ 及更高版本的代码
    use somenamespace{ClassA, ClassB, ClassC as C};
    use function somenamespace{fn_a, fn_b, fn_c};
    use const somenamespace{ConstA, ConstB, ConstC};

    扩展 declare

    每执行一条语句,就会调用一次 register_tick_function() 注册的函数,可以来控制程序的执行时间等功能

    declare(ticks=1);
    
    // 开始时间
    $glnum = 0;
    
    // 检查是否已经超时
    function check_timeout(){
        global $glnum;
        $glnum ++;
        echo sprintf("调用了%s次" . "
    ", $glnum);
    }
    // Zend引擎每执行一次低级语句就执行一下check_timeout
    register_tick_function('check_timeout');
    
    // 假设业务处理
    function yunwu() {
        $a = 1;
        $b = 2;
        $c = 3;
    }
    yunwu();
    
    // 输出结果
    调用了1次
    调用了2次
    调用了3次
    调用了4次
    调用了5次
    调用了6次

    生成器可以返回表达式

    此特性基于 PHP 5.5 版本中引入的生成器特性构建的。 它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。

    function createRange($number){
        for($i=0;$i<$number;$i++){
            yield time();
        }
    }
    
    $result = createRange(10); // 这里调用上面我们创建的函数
    foreach ($result as $val) {
        sleep(1);
        echo $val, PHP_EOL;
    }
    

    应用场景:读取大的文件节省内存

    广州设计公司https://www.houdianzi.com 我的007办公资源网站https://www.wode007.com

    预期

    预期是向后兼用并增强之前的 assert() 的方法。 它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。

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

     
    ini_set('assert.exception', 1);
    class CustomError extends AssertionError {}
    assert(false, new CustomError('Some error message'));
  • 相关阅读:
    js计算两个时间相差天数
    享元模式
    外观模式
    组合模式
    装饰者模式
    桥接模式
    适配器模式
    元素量词 ? + *
    linux安装使用7zip
    linux shell使用别名,切换当前目录
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/13853033.html
Copyright © 2020-2023  润新知