前言
PHP7 是 PHP 编程语言全新的一个版本,主要在性能方面获得了极大的提升。官方的文档显示, PHP7 可以达到 PHP5.x 版本两倍的性能。同时还对 PHP 的语法做了梳理,提供了很多其他语言流行的语法格式。难能可贵的是,做了如此大的改动, PHP7 的兼容性还是非常好的。对于绝大多数的应用来讲,可以不用做修改即可迁移到 PHP7 版本。
简单的测试
- for($i=0;$i<=10000;$i++){
- $a[$i] = $i;
- }
-
- foreach($a as $i){
- }
php6版本去哪里了?
谈到PHP7,大家肯定会问, PHP6 版本去哪儿来呢?这个说来话长。早在2005年的时候,PHP社区发起了PHP6的项目,这个项目旨在为PHP提供完全内置的unicode的支持。但由于种种困难,该项目最终于2010年取消。虽然PHP6这个项目取消了,但大量的功能已经在PHP5.x版本中得以实现。这里面最重要的就是OOP方面的提升。这也帮助PHP实现了从面向过程到面向对象编程的跨越。市面上也随之出现了一大堆的PHP OOP编程框架。
为什么不延续PHP6的序列?
关于这个问题,PHP官方给出了详细的解释,大家可以参考:https://wiki.php.net/rfc/php6
- PHP6版本事实上已经存在了
- PHP6已经在很多的公开会议,场合讨论过
- PHP6还被周边的很多社区所周知。(有很多PHP6的书籍)
- 版本跳跃在开源软件和商业软件里面也经常见。比如MariaDB跳到10.0,Symantec跳过了13版本
- 版本6在动态语言届里面通常和失败相关联。PHP6失败了,Perl6失败了。跳出动态语言届,MySQL6早已存在但一直没有发布
- 7在东方和西方文化里面都认为是一个吉祥数字
于是就有了牛x的一塌糊涂的PHP7版本
PHP7标量类型声明
在PHP7,一个新的功能,标量类型声明已被引入。标量类型声明有两种选择方式
- 强制方式- 强制性是默认模式,不需要指定
- 严格方式 - 严格模式有明确的暗示
示例 - 强制模式
- // Coercive mode
- function sum(int ...$ints) {
- }
- print(sum(2, '3', 4.1));
示例 - 严格模式
- // Strict mode
- declare(strict_types=1);
- function sum(int ...$ints) {
- }
- print(sum(2, '3', 4.1));
空合并运算符
- $name = $name ?? "NoName"; // 如果$name有值就取其值,否则设$name成"NoNa
- me"
飞船操作符
它是用于比较两个表达式。当第一个表达式比第二个表达式分别小于,等于或大于时,它分别返回-1,0或1
- print( 1 <=> 1);print("<br/>"); // 0
- print( 1 <=> 2);print("<br/>"); // -1
- print( 2 <=> 1);print("<br/>"); // 1
- print("<br/>");
-
- //float comparison
- print( 1.5 <=> 1.5);print("<br/>");
- print( 1.5 <=> 2.5);print("<br/>");
- print( 2.5 <=> 1.5);print("<br/>");
- print("<br/>");
-
- //string comparison
- print( "a" <=> "a");print("<br/>");
- print( "a" <=> "b");print("<br/>");
- print( "b" <=> "a");print("<br/>");
PHP常量数组
数组常量现在可以使用 define() 函数定义。 在PHP5.6,它们只能使用const 关键字定义。
- //define a array using define function
- 'dog','cat',
- 'bird'
- ]);
- print(animals[1]);
PHP7匿名类
在php7中,匿名类现在可以使用 new class 来定义。匿名类可以使用来代替完整的类定义。
- interface Logger {
- }
-
- class Application {
- private $logger;
- public function getLogger(): Logger {
- return $this->logger;
- }
- public function setLogger(Logger $logger) {
- $this->logger = $logger;
- }
- }
-
- $app = new Application;
- $app->setLogger(new class implements Logger {
- print($msg);
- }
- });
- $app->getLogger()->log("My first Log Message");
PHP7 use语句
从PHP7起,单次使用 use 语句可以用来从同一个命名空间导入类,函数和常量(而不用多次使用 use 语句)。
- // Before PHP 7
- use com\yiibai\ClassA;
- use com\yiibai\ClassB;use com\yiibai\ClassC as C;
-
- use function com\yiibai\fn_a;
- use function com\yiibai\fn_b;
- use function com\yiibai\fn_c;
-
- use const com\yiibai\ConstA;
- use const com\yiibai\ConstB;
- use const com\yiibai\ConstC;
-
- // PHP 7+ code
- use com\yiibai\{ClassA, ClassB, ClassC as C};
- use function com\yiibai\{fn_a, fn_b, fn_c};
- use const com\yiibai\{ConstA, ConstB, ConstC};
PHP7 一次捕捉多种类型的异常 / 错误
PHP 7.1 新添加了捕获多种异常/错误类型的语法——通过竖杠“|”来实现。
- try {
- throw new LengthException("LengthException");
- // throw new DivisionByZeroError("DivisionByZeroError");
- // throw new Exception("Exception");
- } catch (\DivisionByZeroError | \LengthException $e) {
- echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
- } catch (\Exception $e) {
- echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
- } finally {
- // ...
- }
PHP7整数除法
PHP7引入了intdiv()的新函数,它执行操作数的整数除法并返回结果为 int 类型。
- $value = intdiv(10,3);
- print($value);
PHP7废弃的功能
PHP4风格的构造函数
PHP4式构造函数,它与类的名称相同,现在已过时,并且将在未来被移除。PHP7将发出 E_DEPRECATED 。类实现构造函数 __construct() 方法不受影响。
- class A {
- function A() {
- print('Style Constructor');
- }
- }
静态调用非静态方法
非静态方法静态调用已被弃用,并且可能在将来被移除。
- class A {
- function b() {
- print('Non-static call');
- }
- }
- A::b();
password_hash() - salt 选项
password_hash() 函数的 salt 选项已被弃用,使开发人员不会产生他们自己的(通常是不安全的) salt 。函数本身生成一个加密的安全 salt ,在开发者没有提供 salt 值时 - 因此,定制 salt 生成不再需要了。