PHP7 新特性新功能有哪些?
发布:smiling 来源: PHP粉丝网 添加日期:2018-09-19 09:38:38 浏览: 评论:0
PHP7 就要到来,网上也散布许多零散的相关的消息,PHP7 到底都有些什么改变?我们 PHPer 又将需要做什么改变,本篇博客将尝试一一列举。
PHP7 跟以前不兼容的地方
由于采纳了 AST(Abstract Syntax Tree) 以及 Uniform Variable Syntax,有些代码的意义会有变化,比如:
$obj->$properties['name']
PHP5.6里等价于:
$obj->{$properties['name']}
但在PHP7等价于:
{$obj->$properties}['name']
为了以后升级 PHP7 的时候避免出现问题,目前的可以通过用大括号把代码写得更明确一些。
性能:
由于 phpng 的采纳,性能将得到提升,这应该是 PHP7 聊得最多的话题了,当然,这种对于终端用户仅靠升级 PHP 就可以无痛提升性能的事情,肯定是大家最感兴趣的。除了运行性能的提升以外,内存占用也能得到一定改善,因为数据存储的结构也得到进一步优化。
低版本兼容:
有些兼容代码将被取消掉,比如以前的 ASP 风格的开始标签以及 <script language="php"> 开始标签。
另外还有一大波功能或扩展即将被移除,比如 ext-mysql。
有一个有趣的小改变是,在 switch 里将不允许使用多个 default 语句(什么!以前可以吗?)。
新功能(此处应该有掌声)
尿点已过,精彩的部分已经到来。
普通变量的类型限制以及返回类型
话说之前,是否要给普通变量添加类型限制(也就是在函数定义时像 C 一样需要限制普通类型参数是 int,float 等类型)的 RFC 几乎被 PHP 社区全票通过,但是提议的作者却离开了 PHP 开发组,以及撤销了 RFC……结果导致后来又出现多个关于类型限制的 RFC,并且为了具体实现方式而相互掐架……不过最后还是原提案通过了最终决策。
好吧,对于我们终端用户来说,我们现在可以给普通变量添加类型限制了。不过默认情况类型限制并不是严格的,什么意思呢,比如 function foo(int $bar) {} 这个函数,如果第一个参数传入的是字符串 "123",并不会报错,而是被传换成了数字 123 之后,再传递给变量 $bar。
不过,我们可以通过在文件最上方添加代码 declare(strict_types=1) 来改变默认行为,这个时候如果刚才的函数传入的第一个参数还是字符串,那么就会产生 Fatal Error。
另外,PHP7 也支持定义返回类型,并且行为跟参数是类似的:
- function isEven(int $number): bool
- {
- return $number % 2 === 1;
- }
组合对比操作符:
以前要对比两个数字是 A 大于 B,还是 A 小于 B,还是 A 等于 B,至少得写两个判断:
($a < $b) ? -1 : (($a > $b) ? 1 : 0)
有了组合对比操作符,上面的代码等同于
$a <=> $b
在PHP内核代码里,<=> 操作符叫做“T_SPACESHIP”(太空舰)……叫太空舰操作符或者宇宙飞船操作符还是很霸气的有木有。
Unicode 转义语法
你可以在字符串里使用 \u{xxxx} 来表示一个 unicode 字符。
?? 操作符
类似 ?: 操作符,但等价于 isset($foo) ? $foo : false
如果 $foo 不为 null,返回 $foo,否则返回 'default'
$foo ?? 'default'
??可以连续调用
$config = $config ?? $this->config ?? static::$defaultConfig;
匿名函数绑定
PHP5.4 的时候已经可以将一个方法绑定在一个对象上,在 PHP7 里实现更加简单:
- class HelloWorld
- {
- private $greeting = "Hello";
- }
- $closure = function($whom) { echo $this->greeting . ' ' . $whom; }
- $obj = new HelloWorld();
- $closure->call($obj, 'World'); // Hello World
Use 语句分组:
在 PHP7 之前,use 语句只能这么写
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
PHP7 可以这么写了
- use Symfony\Componenet\HttpFoundation {
- Request;
- Response;
- }
改进版生成器
在 PHP7 之前,生成器是不能有返回值的,否则会报错。不过 PHP7 里是没有问题的,只需要调用一下getReturn()方法即可。
- function gen() {
- yield "Hello";
- yield " ";
- yield "World!";
- return "Goodbye Moon!";
- }
- $gen = gen();
- foreach ($gen as $value) {
- echo $value;
- } //phpfensi.com
- // Outputs "Hello" on iteration 1, " " on iterator 2, and "World!" on iteration 3
- echo $gen->getReturn(); // Goodbye Moon!
生成器委托
PHP7 还支持生成器的相互委托,例如:
- function hello() {
- yield "Hello";
- yield " ";
- yield "World!";
- yield from goodbye();
- }
- function goodbye() {
- yield "Goodbye";
- yield " ";
- yield "Moon!";
- }
- $gen = hello();
- foreach ($gen as $value) {
- echo $value;
- }
上面代码在每一次迭代的时候会依次输出 "Hello" " " "World!" "Goodbye" "Moon!",当然,自己委托自己也是可以的,只不过得小心不要死循环了。
更多的 Exception 类型
在 PHP7,内部错误也将采用 Exception 的方式抛出。当然他是单独的类型,叫 \EngineException,以后许多错误都将被 EngineException 代替。
除此之外,eval() 里的代码如果出现错误,将会抛出 \ParseException,如果函数的参数类型发现与传参不匹配,会抛出 \TypeException。如果要同时处理传统的 Exception 和 EngineException,那就得捕获他们共有的基类 \BaseException
好啦,PHP7 的新功能差不多就这些了,期待 PHP7 的到来吧。
Tags: 新功能 特性
相关文章
- ·PHP7新功能使用教程详解(2018-09-14)
- ·PHP 7.1 新功能之 Nullable Type例子(2018-09-19)
- ·PHP7新功能总结(2021-11-17)
- ·PHP新特性命名空间的详解介绍(2018-09-14)
- ·PHP7新特性foreach 修改使用例子(2018-09-16)
- ·php7.1新特性简单介绍(2018-09-19)
- ·PHP6新特性分析(2019-11-29)
- ·PHP 7的一些引人注目的新特性简单介绍(2021-06-26)
- ·我整理的PHP 7.0主要新特性(2021-07-04)
- ·PHP5.3新特性小结(2021-07-09)
- ·PHP6新特性分析(2021-07-12)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)