1、函数的行参类型可以是标量,在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。标量的模式有强制模式和严格模式两种,
模式声明:declare(strict_types=1); 默认情况值为0,值为1代表为严格校验的模式
强制模式:
严格模式:
很明显上面同样的代码设置不同的模式会有不同的效果,严格模式必须按照指定的类型传值,不然会报错。
2、返回值类型声明:
下面这个声明的返回值是数组,则只能返回数组加入返回其他类型就会报错
3、null合并运算符??
NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
上面的当$a=null或$a不存在时返回‘不存在’,其他都返回$a的值;
4、太空船操作符(组合比较符)
太空船操作符用于比较两个表达式。当$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 ?>
5、通过define()定义常量数组
输出 "cat"
6、匿名类:
<?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();
//常规实例化接口实现对象
$display ->getUserData(new VipUser);//商品价格:120
<?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
7、为unserialize()提供过滤
这个特性旨在提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入。
<?php
// 转换对象为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]);
// 转换对象为 __PHP_Incomplete_Class 对象,除了 MyClass 和 MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
// 默认接受所有类
$data = unserialize($foo, ["allowed_classes" => true]);
8、IntlChar
新增加的 IntlChar 类旨在暴露出更多的 ICU 功能。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。
<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
以上实例会输出:
10ffff
COMMERCIAL AT
bool(true)
若要使用此类,请先安装Intl扩展
9、预期
预期是向后兼用并增强之前的 assert() 的方法。 它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));
?>
以上实例会输出:
Fatal error: Uncaught CustomError: Some error message
10、use 加强
从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。
<?php
// PHP 7 之前版本用法
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 some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>
11、Generator 加强
增强了Generator的功能,这个可以实现很多先进的特性
<?php
<?php
function gen()
{
yield 1;
yield 2;
yield from gen2();
}
function gen2()
{
yield 3;
yield 4;
}
foreach (gen() as $val)
{
echo $val, PHP_EOL;
}
?>
以上实例会输出:
1
2
3
4
12、整除
新增了整除函数 intdiv(),使用实例:
echo intdiv(10, 3);//3