1. 文章
  2. 文章详情

php7新特性总结(一)

抽象语法树

php7新特性总结(一)

假如现在我们有这样的需求,要对php源文件就行语法检测,实现编码规范。

php5之前的话,没有AST,直接从parser就生成了opcodes!就需要借助一些外部的php语法解析器来实现;

而php7增加了AST,我们可以自己去实现这样一个扩展,利用扩展提供的函数可以直接获取文件对应的的AST结构,而这样的结构正是我们可以识别的,所以就可以在这个基础上去做一些优化和判断了。

标量类型声明

类型声明允许函数在调用时要求参数为特定类型。 如果给出的值类型不对,那么将会产生一个错误: 在PHP 5中,这将是一个可恢复的致命错误,而在PHP 7中将会抛出一个TypeError异常。

为了指定一个类型声明,类型应该加到参数名前。这个声明可以通过将参数的默认值设为NULL来实现允许传递NULL

php7新特性总结(一)

上例子:

  • 基本类类型声明
class C {}
class D extends C {}

// This doesn't extend C.
class E {}

function f(C $c) {
    echo get_class($c)."n";
}

f(new C);
f(new D);
f(new E);
//运行代码会报错, 对类的实例的限制,也就是f参数必须是 C类的 实例
  • 基本接口类型声明
interface I { public function f(); }
class C implements I { public function f() {} }

// This doesn't implement I.
class E {}

function f(I $i) {
    echo get_class($i)."n";
}

f(new C);
f(new E);

// 运行代码会报错, 对类实现接口的限制, 也就是说 f参数必须是对I接口的实例
  • 可空类型声明
class C {}

function f(C $c = null) {
    var_dump($c);
}

f(new C);
f(null);

严格类型:(严格类型仅用于标量类型声明,也正是因为如此,这需要PHP 7.0.0 或更新版本,因为标量类型声明也是在那个版本中添加的)

  • 参数类型严格检查
declare(strict_types=1); //开启语法检查

function sum(int $a, int $b) {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));
// 不开启语法检查 则 是不报错的

返回值类型声明

值通过使用可选的返回语句返回。可以返回包括数组和对象的任意类型。返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行。

例子:

declare(strict_types=1);
function sum($a, $b): float { // 限定返回值为 浮点型
    return $a + $b;
}

var_dump(sum(1, 2));

//输出结果为:  flota(3)
declare(strict_types=1);

function sum($a, $b): int {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1, 2.5));
// 报错
declare(strict_types=1);
class C {}
class E {}
function getC(): C {
    return new E;
}

var_dump(getC());
//报错
declare(strict_types=1);
function fileOpen(string $fileName, string $mode): resource  // 限制返回的是一个资源
{
    $handle = fopen($fileName, $mode);
    if ($handle !== false)
    {
        return $handle;
    }
}

$resourceHandle = fileOpen("myfile.txt", "r");
declare(strict_types=1);
function ret_void(): void {   //没有任何值返回的时候
    if (true) {
        return; // break
        // return null; // even this NO!
    }

    $db->doSomething();
}

新增的几个操作符

<=>

// 整数
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

??

$a = null;
$b = 1;
$c = 2;
echo $a ?? $b , , , $c ?? $b; // 1,2
echo $a ?? $b ?? $c  , , , $a ?? $d ?? $c; // 1,2

u{xxxx}

php
declare(strict_types=1);
// 从右至左强制
echo"u{70}u{66}inalu{793e}u{533a}u{725b}u{903c}";
//输出: pfinal社区牛逼

define()义常量数组 

define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // 输出 "cat"

匿名类

// PHP 7 之前的代码
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}

$util->setLogger(new Logger());

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

匿名类参考:

PHP: 匿名类 - Manual​php.net

参考:https://zhuanlan.zhihu.com/p/53112756

发表评论

登录后才能评论

评论列表(0条)