PHP7新增特性
新增操作符
1.“太空船”操作符“<=>”
语法:$c = $a <=> $b
如果$a > $b, $c 的值为1
如果$a == $b, $c 的值为0
如果$a < $b, $c 的值为-1
2.操作符“??”
如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
$username = isset($_GET['user]) ? $_GET['user] : 'nobody'; //原写法
$username = $_GET['user'] ?? 'nobody'; //现在
定义、声明、引用
1.define() 定义常量数组
define('ARR',['a','b']);
echo ARR[1];// a
2.强类型的声明
declare(strict_types=1),必须放在文件的第一行执行代码,当前文件有效!
declare(strict_types=1);
function add(int $a, int $b): int {
return $a+$b;
}
echo add(1, 2);
echo add(1.5, 2.6);
php5无法执行,php7上述add函数传参必须与声明的类型相同,否则报错
强类型比弱类型的优缺点:
优点:类型不再自动转型,避免一些因为自动转型造成的错误
缺点:强类型语言代码编写要复杂些
3.命名空间批量引用
// PHP5写法
use FooLibrary\Bar\Baz\ClassA;
use FooLibrary\Bar\Baz\ClassB;
// PHP7新语法写法
use FooLibrary\Bar\Baz\{ ClassA, ClassB};
异常处理
在 PHP 7 中,很多致命错误以及可恢复的致命错误,都被转换为异常来处理了。
PHP7引入全局的throwable接⼝,Exception和部分Error实现了该接⼝。
因此错误可以像异常⼀样捕获
如果未捕获,则调⽤自定义异常处理函数进⾏处理
如果尚未注册异常函数,那么才按照传统的⽅式处理,报致命错误。
Error类并⾮继承⾃Exception类,因此不能使⽤catch(Exception $e)来捕获,⽽是使⽤catch(Error $e)或通过注册异常处理函数( set_exception_handler())来捕获。
php代码执行过程改变
PHP7 的内核中有一个重要的变化是加入了 AST
AST在PHP编译过程作为一个中间件的角色, 替换原来直接从解释器吐出opcode的方式, 让解释器(parser)和编译器(compliler)解耦, 可以减少一些Hack代码, 同时, 让实现更容易理解和可维护。
在 PHP5中,从 php 脚本到 opcodes 的执行的过程是:
1.Lexing:词法扫描分析,将源文件转换成 token 流;
2.Parsing:语法分析,在此阶段生成 op arrays。
PHP7 中在语法分析阶段不再直接生成 op arrays,而是先生成 AST,所以过程多了一步:
1.Lexing:词法扫描分析,将源文件转换成 token 流;
2.Parsing:语法分析,从 token 流生成抽象语法树;
3.Compilation:从抽象语法树生成 op arrays。
php7变更
字符串处理机制变更
含有十六进制字符的字符串不再视为数字
var_dump("0x123" == "291"); // false
var_dump(is_numeric("0x123")); // false
var_dump("0xe" + "0x1"); // 0
var_dump(substr("f00", "0x1")) // foo
参数处理机制修改
1.不支持重复参数命名
function func($b, $b) {} ;报错
2.func_get_arg()和func_get_args()这两个方法返回参数当前的值, 而不是传入时的值, 当前的值有可能会被修改
function foo($x) {
$x++;
echo func_get_arg(0);
}
foo(1); //返回2
foreach修改
1.foreach()循环对数组内部指针不再起作用
$arr = [1,2,3];
foreach ($arr as &$val) {
echo current($arr);// php7 全返回0
}
2.按照值进行循环的时候, foreach是对该数组的拷贝操作
$arr = [1,2,3];
foreach ($arr as $val) {
unset($arr[1]);
}
var_dump($arr); //最新的php7依旧会打印出[1,2,3]。(ps:7.0.0不行) php5的会打印出[1,3]
网友评论