PHP7 新特性

Jackey PHP 2,602 次浏览 , 没有评论

前言

PHP7 PHP 编程语言全新的一个版本,主要在性能方面获得了极大的提升。官方的文档显示, PHP7 可以达到 PHP5.x 版本两倍的性能。同时还对 PHP 的语法做了梳理,提供了很多其他语言流行的语法格式。难能可贵的是,做了如此大的改动, PHP7 的兼容性还是非常好的。对于绝大多数的应用来讲,可以不用做修改即可迁移到 PHP7 版本。

简单的测试

  1. $a = array();
  2. for($i=0;$i<=10000;$i++){
  3. $a[$i] = $i;
  4. }
  5.  
  6. foreach($a as $i){
  7. array_search($i,$a);
  8. }

 

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,一个新的功能,标量类型声明已被引入。标量类型声明有两种选择方式

  • 强制方式- 强制性是默认模式,不需要指定
  • 严格方式 - 严格模式有明确的暗示

示例 - 强制模式

  1. // Coercive mode
  2. function sum(int ...$ints) {
  3. return array_sum($ints);
  4. }
  5. print(sum(2, '3', 4.1));

 

示例 - 严格模式

  1. // Strict mode
  2. declare(strict_types=1);
  3. function sum(int ...$ints) {
  4. return array_sum($ints);
  5. }
  6. print(sum(2, '3', 4.1));

空合并运算符

  1. $name = $name ?? "NoName"; // 如果$name有值就取其值,否则设$name成"NoNa
  2. me"

飞船操作符

它是用于比较两个表达式。当第一个表达式比第二个表达式分别小于,等于或大于时,它分别返回-101

  1. print( 1 <=> 1);print("<br/>"); // 0
  2. print( 1 <=> 2);print("<br/>"); // -1
  3. print( 2 <=> 1);print("<br/>"); // 1
  4. print("<br/>");
  5.  
  6. //float comparison
  7. print( 1.5 <=> 1.5);print("<br/>");
  8. print( 1.5 <=> 2.5);print("<br/>");
  9. print( 2.5 <=> 1.5);print("<br/>");
  10. print("<br/>");
  11.  
  12. //string comparison
  13. print( "a" <=> "a");print("<br/>");
  14. print( "a" <=> "b");print("<br/>");
  15. print( "b" <=> "a");print("<br/>");

PHP常量数组

数组常量现在可以使用 define() 函数定义。 在PHP5.6,它们只能使用const 关键字定义。

  1. //define a array using define function
  2. define('animals', [
  3. 'dog','cat',
  4. 'bird'
  5. ]);
  6. print(animals[1]);

PHP7匿名类

php7中,匿名类现在可以使用 new class 来定义。匿名类可以使用来代替完整的类定义。

  1. interface Logger {
  2. public function log(string $msg);
  3. }
  4.  
  5. class Application {
  6. private $logger;
  7. public function getLogger(): Logger {
  8. return $this->logger;
  9. }
  10. public function setLogger(Logger $logger) {
  11. $this->logger = $logger;
  12. }
  13. }
  14.  
  15. $app = new Application;
  16. $app->setLogger(new class implements Logger {
  17. public function log(string $msg) {
  18. print($msg);
  19. }
  20. });
  21. $app->getLogger()->log("My first Log Message");

PHP7 use语句

PHP7起,单次使用 use 语句可以用来从同一个命名空间导入类,函数和常量(而不用多次使用 use 语句)

  1. // Before PHP 7
  2. use com\yiibai\ClassA;
  3. use com\yiibai\ClassB;use com\yiibai\ClassC as C;
  4.  
  5. use function com\yiibai\fn_a;
  6. use function com\yiibai\fn_b;
  7. use function com\yiibai\fn_c;
  8.  
  9. use const com\yiibai\ConstA;
  10. use const com\yiibai\ConstB;
  11. use const com\yiibai\ConstC;
  12.  
  13. // PHP 7+ code
  14. use com\yiibai\{ClassA, ClassB, ClassC as C};
  15. use function com\yiibai\{fn_a, fn_b, fn_c};
  16. use const com\yiibai\{ConstA, ConstB, ConstC};

PHP7 一次捕捉多种类型的异常 / 错误

PHP 7.1 新添加了捕获多种异常/错误类型的语法——通过竖杠“|”来实现。

  1. try {
  2. throw new LengthException("LengthException");
  3. // throw new DivisionByZeroError("DivisionByZeroError");
  4. // throw new Exception("Exception");
  5. } catch (\DivisionByZeroError | \LengthException $e) {
  6. echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
  7. } catch (\Exception $e) {
  8. echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
  9. } finally {
  10. // ...
  11. }

PHP7整数除法

PHP7引入了intdiv()的新函数,它执行操作数的整数除法并返回结果为 int 型。

  1. $value = intdiv(10,3);
  2. var_dump($value);
  3. print($value);

PHP7废弃的功能

PHP4风格的构造函数

PHP4式构造函数,它与类的名称相同,现在已过时,并且将在未来被移除。PHP7将发出 E_DEPRECATED 。类实现构造函数 __construct() 方法不受影响。

  1. class A {
  2. function A() {
  3. print('Style Constructor');
  4. }
  5. }

静态调用非静态方法

非静态方法静态调用已被弃用,并且可能在将来被移除。

  1. class A {
  2. function b() {
  3. print('Non-static call');
  4. }
  5. }
  6. A::b();

password_hash() - salt 选项

password_hash() 函数的 salt 选项已被弃用,使开发人员不会产生他们自己的(通常是不安全的) salt 。函数本身生成一个加密的安全 salt ,在开发者没有提供 salt 值时 - 因此,定制 salt 生成不再需要了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go