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 Name\Space {
    const FOO = 42;
    function f() { echo "FUNCTION" . "<br>"; }
}
namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;
    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");
posted @ 2018-04-15 15:13  jaspersong  阅读(167)  评论(0编辑  收藏  举报