PHP7.0新特性

1、匿名类

<?php
interface Logger {
    public function log(string $msg);
}

class Application {
    public $logger;//官方文档是private 私有属性、改成了public
    //指定了、返回的对象属于Logger接口
    public function getLogger(): Logger {
        return $this->logger;
    }
    //把对象当做变量设置到了$logger属性上
    public function setLogger(Logger $logger) {
        $this->logger = $logger;
    }
}

$app = new Application;
//在方法里面设置了一个对象、把对象作为变量值、传入setLogger方法中
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});

var_dump($app->getLogger());
echo $app->logger->log("你好?");
//外部调用属性对象

php7之前的匿名类代码

<?php
class Logger {
    public function log(string $msg){
        echo $msg;
    }
}

class Application {
    public $logger;//官方文档是private 私有属性、改成了public
    //指定了、返回的对象属于Logger接口
    public function getLogger(): Logger {
        return $this->logger;
    }
    //把对象当做变量设置到了$logger属性上
    public function setLogger(Logger $logger) {
        $this->logger = $logger;
    }
}

$app = new Application;
//在方法里面设置了一个对象、把对象作为变量值、传入setLogger方法中
//php7之前
$app->setLogger(new Logger());

var_dump($app->getLogger());
$Logger=$app->getLogger();
$Logger->log("你好");

php7以后

// 使用了 PHP 7+ 后的代码
$app->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});

可以传递参数到匿名类的构造器,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用 trait:

<?php
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}

var_dump(new class(10) extends SomeClass implements SomeInterface {
    private $num;

    public function __construct($num)
    {
        $this->num = $num;
    }
    use SomeTrait;
});

官方文档:http://php.net/manual/zh/language.oop5.anonymous.php

2、Closure::call

闭包绑定 简短干练的暂时绑定一个方法到对象上闭包并调用它。

<?php
class A {private $x = 1;}

// Pre PHP 7 code
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX(); //输出1

// PHP 7+ code
$getX = function() {return $this->x;}; //输出1
echo $getX->call(new A);

3、Unicode codepoint 转译语法

这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的

<?php

echo  "\u{aa}";// ª
echo  "\u{0000aa}";// ª
echo  "\u{9999}";// 香

4、带过滤的unserialize

提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入

<?php
class a{
    public static $s=1;
    public $d=2;
    private $c=null;

}
class b extends a{}
$foo =new b();

$foo=serialize($foo);
// 将所有的对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]);
var_dump($data);

// 将除 a和b 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => ['a','b']]);
var_dump($data);
// 默认情况下所有的类都是可接受的,等同于省略第二个参数
$data = unserialize($foo, ["allowed_classes" => true]);
var_dump($data);

5、组合比较符 (<=>)

组合比较符号用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1,比较规则延续常规比较规则。对象不能进行比较

<?php
var_dump('PHP' <=> 'Node'); // int(1)
var_dump(123 <=> 456); // int(-1)
var_dump(['a', 'b'] <=> ['a', 'b']); // int(0)

6、null合并运算符

由于日常使用中存在大量同时使用三元表达式和isset操作。使用null合并运算符可以简化操作

<?php
# php7以前
if(isset($_GET['a'])) {
    $a = $_GET['a'];
}
# php7以前
$a = isset($_GET['a']) ? $_GET['a'] : 'none';

#PHP 7
$a = isset($_GET['a']) ?? 'none';

7、变量类型声明

变量类型声明有两种模式。一种是强制的,和严格的。允许使用下列类型参数intstringfloatbool

同时不能再使用intstringfloatbool作为类的名字了

function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1)); // int(9)

严格模式

<?php
# 严格模式
declare(strict_types=1);

function add(int $x, int $y)
{
    return $x + $y;
}
var_dump(add('2', 3)); // Fatal error: Argument 1 passed to add() must be of the type integer

8、返回值类型声明

增加了返回类型声明,类似参数类型。这样更方便的控制函数的返回值.在函数定义的后面加上:类型名即可

<?php
function fun(int $a): array
{
    return $a;
}
fun(3);//Fatal errornt 1 passed to add() must be of the type intege

9、命名空间按组导入

#php7以前
use app\model\A;
use app\model\B;
#php7+
use app\model{A,B}

10、IntlChar类

这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。需要安装intl拓展

printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));

11、define 支持定义数组

#php7+
define('ALLOWED_IMAGE_EXTENSIONS', ['jpg', 'jpeg', 'gif', 'png']);
Last modification:January 30, 2020
如果觉得我的文章对你有用,请随意赞赏