很早之前就行整理整理PHP7的新语法,眨眼都很多年过去了。。。今天忙里偷闲整理下,都是非常实用的东西。
标量类型声明
默认情况下,所有的PHP文件都处于弱类型校验模式。 PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式:强制模式 (默认),严格模式。
可以使用的类型参数有:
- int
- float
- bool
- string
- interfaces
- array
- callable
function sum(int ...$ints)
{
return array_sum($ints);
}
print(sum(2, '3', 4.1));
返回类型声明
PHP 7 增加了对返回类型声明的支持,返回类型声明指明了函数返回值的类型。
可以声明的返回类型有:
- int
- float
- bool
- string
- interfaces
- array
- callable
- void
function returnIntValue(int $value): int
{
return $value;
}
print(returnIntValue(5));
null合并运算符
这个太好用了。哈哈哈!
//php7以前 if判断
if(empty($_GET['param'])) {
$param = 1;
}else{
$param = $_GET['param'];
}
//php7以前 三元运算符
$param = empty($_GET['param']) ? 1 : $_GET['param'];
//PHP7 null合并运算符
$param = $_GET['param'] ?? 1;//1
太空船运算符
组合比较符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用PHP的常规比较规则进行的。
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
use 语句
可以减少很多代码。
// PHP 7 之前版本需要使用多次 use
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
匿名类
允许new class {} 创建一个匿名的对象.
<?php
//php7以前 接口实现
interface User{
public function getDiscount();
}
class VipUser implements User{
//折扣系数
private $discount = 0.6;
public function getDiscount() {
return $this->discount;
}
}
class Goods{
private $price = 200;
private $objectVipUser;
//User接口VipUser类实现
public function getUserData($User){
$this->objectVipUser = $User;
$discount = $this->objectVipUser->getDiscount();
echo "商品价格:".$this->price*$discount;
}
}
$display = new Goods();
<?php
//php7 创建一个匿名的对象
interface User{
public function getDiscount();
}
class Goods{
private $price = 200;
private $objectVipUser;
public function getUserData($User){
$this->objectVipUser = $User;
$discount = $this->objectVipUser->getDiscount();
echo "商品价格:".$this->price*$discount;
}
}
$display = new Goods();
//new匿名对象实现user接口
$display ->getUserData(new class implements User{
private $discount = 0.6;
public function getDiscount() {
return $this->discount;
}
});//商品价格:120
Closure::call()
Closure::call() 方法被添加为一个简短的方式来临时绑定一个对象作用域到一个闭包并调用它. 与PHP5的bindTo相比.它的性能要快得多.
<?php
//php7以前
class A {
private $attribute = 'hello world';
}
$getClosure = function(){
return $this->attribute;
};
$getAttribute = $getClosure->bindTo(new A, 'A');//中间层闭包
echo $getAttribute();//hello world
<?php
//PHP7
class A {
private $attribute = 'hello world';
}
$getClosure = function(){
return $this->attribute;
};
echo $getClosure->call(new A);//hello world
整数整除的函数inidiv()
intdiv ( int $dividend , int $divisor ) : int
list函数
list($a, $b, $c) = [1, 2, 3];
错误处理
PHP7 改变了大多数错误的报告方式.不同于PHP5的传统错误报告机制,现在大多数错误被作为Error异常抛出.