zoukankan      html  css  js  c++  java
  • php7新特性

    1、标量类型和返回值类型声明

    PHP 7增加了对参数类型的声明,除了string类型外,int和array类型也可以声明。
    PHP 7 增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。

    /**
     * 标量类型和返回值类型声明
     * 等差数列求和
     * @param int $a1
     * @param int $count
     * @param int $diff
     * @return int
     */
    function arrSum(int $a1, int $count, int $diff = 1): int
    {
        $sum = $a1 * $count + $count * ($count - 1) * $diff / 2;
        return $sum;
    }
    // echo arrSum(1, 100, 1);
    

    2、 NULL 合并运算符

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

    /**
     * 新增??操作符,PHP NULL 合并运算符
     * @param string $params
     * @return array
     */
    function nullOps(string $params):array
    {
        $old = $params ? $params : '';
        $new = $params ?? '';
        return [$old, $new];
    }
    //print_r(nullOps('jaspersong'));
    

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

    太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。

    /**
     * PHP 太空船运算符(组合比较符)
     * @param string $number1
     * @param string $number
     * @return int
     */
    function compare(string $number1 , string $number):int
    {
        return $number1 <=> $number;
    }
    
    //var_dump(compare('jasper', 'jaspersong')); -1 
    //var_dump(compare('jasper', 'aijasper')); 1
    //var_dump(compare('jasper', 'jasper')); 0
    

    4、通过 define() 定义常量数组 (PHP 7)

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

    /**
     * 定义常量数组
     * @return array
     */
    function arrDefine():array
    {
        define('ANIMALS', [1, 2, 3, 4]);
        return  ANIMALS;
    }
    
    var_dump(arrDefine());
    const ARRAY_DEF = ['jasper', 'aijasper', 'jaspersong', 'leon'];
    var_dump(ARRAY_DEF);
    

    5、Generators生成器

    通过添加 yield 关键字支持了 generators,Generators 提供了一个更简单的方法实现迭代器,不需要实现 Iterator 接口。

    /**
     * 生成器
     */
    function yeildFunc()
    {
        /* 注意保存在内存中的数组绝不会被创建或返回 */
        foreach (xrange(1, 9, 2) as $number) {
            echo "$number ";
        }
    }
    
    /**
     * @param $start
     * @param $limit
     * @param int $step
     * @return Generator
     */
    function xrange($start, $limit, $step = 1) {
        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    }
    echo 'Single digit odd numbers: ';
    
    yeildFunc();
    输出结果:
    Single digit odd numbers: 1 3 5 7 9
    

    6、foreach 现在支持 list()

    function forList()
    {
        $arrData = [
            ['jasper', 'leon'],
            ['leon', 'aijasper']
        ];
        foreach ($arrData as list($a, $b)) {
            echo "A: $a; B: $b <br>";
        }
    }
    forList();
    输出结果如下:
    A: jasper; B: leon 
    A: leon; B: aijasper 
    

    7、新增 finally 关键字

    关于finally的说明:
    不管有木有出现异常,finally块中代码都会执行;
    当try和catch中有return时,finally仍然会执行;
    inally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,
    而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
    finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

    /**
     * @param bool $flag
     * @return string
     */
    function anonymous(bool $flag = false)
    {
        try {
            if ($flag) {
                throw new Exception("抛出一个异常");
            } else {
                return "jaspersong<br>";
            }
            
        } catch (Exception $e) {
            echo $e->getMessage() . "<br>";
        } finally {
            echo "try catch执行完成,走到finally流程";
        }
    }
    // 当try中有返回值时,finally中没有返回值,最后函数返回的时try中保存的值
    // 适合需要在执行完成后进行一些后续状态的的操作
    print_r(anonymous(false));
    print_r(anonymous(true));
    输出结果如下:
    try catch执行完成,走到finally流程
    jaspersong
    抛出一个异常
    try catch执行完成,走到finally流程
    

    另外一种情况:

    /**
     * @param bool $flag
     * @return string
     */
    function anonymousNew(bool $flag = false)
    {
        try {
            if ($flag) {
                throw new Exception("抛出一个异常");
            } else {
                return "jasper<br>";
            }
            
        } catch (Exception $e) {
            echo $e->getMessage() . "<br>";
        } finally {
            echo "try catch执行完成,走到finally流程<br>";
            return 'leon';
        }
    }
    
    // 当try中有返回值时,finally中也有返回值,最后函数返回的是finally中保存的值
    print_r(anonymousNew(false));
    print_r(anonymousNew(true));
    输出结果为:
    try catch执行完成,走到finally流程
    leon抛出一个异常
    try catch执行完成,走到finally流程
    leon
    

    8、array_column

    function arrayColumn()
    {
        // 表示从数据库返回的可能记录集的数组
        $records = [
            [
                'id' => 2135,
                'first_name' => 'John',
                'last_name' => 'Doe',
            ],
            [
                'id' => 3245,
                'first_name' => 'Sally',
                'last_name' => 'Smith',
            ],
            [
                'id' => 5342,
                'first_name' => 'Jane',
                'last_name' => 'Jones',
            ],
            [
                'id' => 5623,
                'first_name' => 'Peter',
                'last_name' => 'Doe',
            ],
            [
                'id' => 5629,
                'first_name' => 'Peter',
                'last_name' => 'Doe',
            ],
        ];
        
        $firstNames = array_column($records, 'first_name');
        print_r($firstNames);
        echo "<br>";
        $lastNames = array_column($records, 'last_name', 'id');
        print_r($lastNames);
    }
    arrayColumn();
    输出结果为:
    Array ( [0] => John [1] => Sally [2] => Jane [3] => Peter [4] => Peter ) 
    Array ( [2135] => Doe [3245] => Smith [5342] => Jones [5623] => Doe [5629] => Doe )
    

    9、使用 ... 运算符定义变长参数函数

    使用 ... 运算符定义变长参数函数。

    /**
     * @param $req
     * @param null $opt
     * @param array ...$params
     */
    function f($req, $opt = null, ...$params) {
        // $params 是一个包含了剩余参数的数组
        printf('$req: %d; $opt: %d; number of params: %d'."<br>",
            $req, $opt, count($params));
        
        $args = func_get_args();
    //    var_dump($args);
    }
    f(1);
    f(1, 2);
    f(1, 2, 3);
    f(1, 2, 3, 4);
    f(1, 2, 3, 4, 5);
    输出结果为:
    $req: 1; $opt: 0; number of params: 0
    $req: 1; $opt: 2; number of params: 0
    $req: 1; $opt: 2; number of params: 1
    $req: 1; $opt: 2; number of params: 2
    $req: 1; $opt: 2; number of params: 3
    

    使用 ... 运算符进行参数展开(PHP 5 >= 5.6.0, PHP 7)。
    在调用函数的时候,使用 ... 运算符, 将 数组 和 可遍历 对象展开为函数参数。 在其他编程语言,比如 Ruby中,这被称为连接运算符。

    /**
     * @param $a
     * @param $b
     * @param $c
     * @return mixed
     */
    function add($a, $b, $c) {
        return $a + $b + $c;
    }
    $operators = [1, 2, 3];
    echo add(...$operators);
    

    11、intdiv对除数取整函数

    /**
     * 对除法结果取整
     * @param int $dividend
     * @param int $divisor
     * @return int
     */
    function Myintdiv(int $dividend , int $divisor)
    {
        return intdiv($dividend, $divisor);
    }
    print_r(Myintdiv(100, 3));
    输出结果为:
    33
    

    12、use function 以及 use const (PHP 5 >= 5.6.0, PHP 7)

    use 运算符 被进行了扩展以支持在类中导入外部的函数和常量。 对应的结构为 use function 和 use const。

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2018/4/15
     * Time: 12:03
     */
    namespace NameSpace {
        const FOO = 42;
        function f() { echo "FUNCTION" . "<br>"; }
    }
    namespace {
        use const NameSpaceFOO;
        use function NameSpacef;
        echo FOO . "<br>";
        f();
    }
    

    13、匿名类 (PHP 7)

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2018/4/15
     * Time: 12:10
     */
    
    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;
    
    // 显示类
    class MyLogger implements Logger
    {
        public function log(string $msg) {
            echo $msg;
        }
    }
    // 匿名类
    $app->setLogger(new class implements Logger {
        public function log(string $msg) {
            echo $msg;
        }
    });
    $app->setLogger(new MyLogger());
    var_dump($app->getLogger());
    $logger = $app->getLogger();
    $logger->log("leon&jasper");
    
  • 相关阅读:
    Druid连接池的简单使用
    JDBC工具包commons-dbutils的基本介绍
    Java IO: ByteArrayOutputStream使用
    开源数据库连接池之Tomcat内置连接池
    jquery里面的$(this)和this的区别
    css自定义属性(css变量)
    CSS选择器
    IntelliJ IDEA 学习笔记
    JSP基本的语法、3个编译指令、7个动作指令、9个内置对象
    CSS3 box-shadow
  • 原文地址:https://www.cnblogs.com/jaspersong/p/8847674.html
Copyright © 2011-2022 走看看