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