抽象语法树

假如现在我们有这样的需求,要对php源文件就行语法检测,实现编码规范。
php5之前的话,没有AST,直接从parser就生成了opcodes!就需要借助一些外部的php语法解析器来实现;
而php7增加了AST,我们可以自己去实现这样一个扩展,利用扩展提供的函数可以直接获取文件对应的的AST结构,而这样的结构正是我们可以识别的,所以就可以在这个基础上去做一些优化和判断了。
标量类型声明
类型声明允许函数在调用时要求参数为特定类型。 如果给出的值类型不对,那么将会产生一个错误: 在PHP 5中,这将是一个可恢复的致命错误,而在PHP 7中将会抛出一个TypeError异常。
为了指定一个类型声明,类型应该加到参数名前。这个声明可以通过将参数的默认值设为NULL来实现允许传递NULL。

上例子:
- 基本类类型声明
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;
}
});
匿名类参考:
评论列表(0条)