搜索
首页后端开发PHP7php7新特性的理解和比较

1. null合并运算符(??)

??语法: 如果变量存在且值不为NULL,它就会返回自身的值,否则返回它的第二个操作数.


//php7以前  if判断 
if(empty($_GET['param'])) { 
     $param = 1; 
}else{ 
    $param = $_GET['param']; 
} 
  
//php7以前  三元运算符 
$param = empty($_GET['param']) ? 1 : $_GET['param'];

//PHP7  null合并运算符
 
 $param = $_GET['param'] ?? 1;//1

 2. define() 定义常量数组


 //php7以前 
 define("CONTENT", "hello world"); 
  echo CONTENT;//hello world 
  
 //PHP7 
 define('ANIMALS', [ 
    'dog', 
     'cat', 
    'bird'
]);
 echo ANIMALS[2];//bird

 //PHP7 类外也可使用const来定义常量
 const CONSTANT = 'Hello World'; 
 echo CONSTANT;//Hello World

 3. 组合比较符(<=>)

组合比较符用于比较两个表达式.当$a小于、等于或大于$b时它分别返回-1、0或1. 比较的原则是沿用PHP的常规比较规则进行的.


 /整数 
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

 4. 变量类型声明

两种模式: 强制(默认)和严格模式. 可以使用下列类型参数: string,int,float,bool


  //... 操作符: 表示这是一个可变参数. php5.6及以上的版本可使用: 函数定义的时候变量前使用. 
  function intSum(int ...$ints){ 
     return array_sum($ints); 
  } 
 var_dump(intSum(2,'3.5'));//5 
   
  //严格模式 
  //模式声明:declare(strict_types=1);  默认情况值为0,值为1代表为严格校验的模式  
  declare(strict_types=1);
  function add(int $a,int $b){
      return $a+$b;
  }
  var_dump(add(2,'3.5')); //Fatal error: Uncaught TypeError: Argument 2 passed to add() must be of the type integer

 5. 返回值类型声明

增加返回类型声明的支持.类似于参数类型声明.(用法在函数定义的后面加 :类型名)


 //有效的返回类型
declare(strict_types = 1);
 function getInt(int $value): int {
   return $value;
 }
 print(getInt(6));//6


//无效返回类型
declare(strict_types = 1);
 function getNoInt(int $value): int {
   return $value+'2.5';
 }
 print(getNoInt(6));//Fatal error: Uncaught TypeError: Return value of getNoInt() must be of the type integer

 6. 匿名类

允许new class {} 创建一个匿名的对象.


  <?php 
  //php7以前 接口实现 
  interface User{ 
      public function getDiscount(); 
  } 
  class VipUser implements User{ 
      //折扣系数 
      private $discount = 0.6; 
      public function getDiscount() {
          return $this->discount;
      }
  }
  class Goods{
      private $price = 200;
      private $objectVipUser;
      //User接口VipUser类实现
      public function getUserData($User){
          $this->objectVipUser = $User;
          $discount = $this->objectVipUser->getDiscount();
          echo "商品价格:".$this->price*$discount;
      }
  }
  $display = new Goods();
  //常规实例化接口实现对象
  $display ->getUserData(new VipUser);//商品价格:120


  <?php 
  //php7 创建一个匿名的对象 
  interface User{ 
      public function getDiscount(); 
  } 
  class Goods{ 
      private $price = 200; 
      private $objectVipUser; 
      public function getUserData($User){
          $this->objectVipUser = $User;
          $discount = $this->objectVipUser->getDiscount();
          echo "商品价格:".$this->price*$discount;
      }
  }
  $display = new Goods();
  //new匿名对象实现user接口
  $display ->getUserData(new class implements User{
      private $discount = 0.6;
      public function getDiscount() {
          return $this->discount;
      }
  });//商品价格:120

 7. Closure::call()

Closure::call() 方法被添加为一个简短的方式来临时绑定一个对象作用域到一个闭包并调用它. 与PHP5的bindTo相比.它的性能要快得多.


  <?php 
  //php7以前 
  class A { 
      private  $attribute = &#39;hello world&#39;; 
  } 
   
  $getClosure = function(){ 
      return $this->attribute; 
  };
  
  $getAttribute = $getClosure->bindTo(new A, 'A');//中间层闭包
  echo $getAttribute();//hello world


  <?php 
  //PHP7 
  class A { 
      private  $attribute = &#39;hello world&#39;; 
  } 
   
  $getClosure = function(){ 
      return $this->attribute; 
  };
  
  echo $getClosure->call(new A);//hello world

 8. unserialize()

unserialize()函数:过滤的特性,可以防止非法数据进行代码注入,提供了更安全的反序列化数据


  <?php 
  class A{  
     public $name = &#39;admin_a&#39;;    
  } 
  class B{ 
     public $name = &#39;admin_b&#39;; 
  } 
  $objA = new A(); 
 $objB = new B(); 
 $serializedObjA = serialize($objA); 
 $serializedObjB = serialize($objB); 
 //默认行为是接收所有类; 第二个参数可以忽略
 $dataA = unserialize($serializedObjA , ["allowed_classes" => true]); 
 var_dump($dataA);//object(A)#3 (1) { ["name"]=> string(7) "admin_a" }
//如果allowed_classes设置为false,unserialize会将所有对象转换为__PHP_Incomplete_Class对象 
 $dataA = unserialize($serializedObjA , ["allowed_classes" => false]); 
 var_dump($dataA);//object(__PHP_Incomplete_Class)#4 (2) { ["__PHP_Incomplete_Class_Name"]=> string(1) "A" ["name"]=> string(7) "admin_a" }
//转换所有对象到 __PHP_Incomplete_Class对象,除了对象"B"
 $dataB = unserialize($serializedObjB , ["allowed_classes" => ["B"]]); 
var_dump($dataB);//object(B)#3 (1) { ["name"]=> string(7) "admin_b" }

 9. IntlChar

IntlChar:提供了一些可用于访问Unicode字符信息的实用方法的访问. 注意:必须安装Intl扩展才能使用!


var_dump(IntlChar::CODEPOINT_MAX);//int(1114111) 
echo '<br>';
var_dump(IntlChar::charName('+'));//string(9) "PLUS SIGN" 
echo '<br>';
var_dump(IntlChar::ispunct('?'));//bool(true)

10. CSPRNG

CSPRNG 函数提供一种简单的机制来生成密码的随机数.

random_bytes() -加密生存被保护的伪随机字符串.

random_int() -加密生存被保护的伪随机整数.


$bytes = random_bytes(8); 
echo(bin2hex($bytes));//随机2073a110a2e3c497
echo '<br>';
echo(random_int(1, 999));//随机786
echo '<br>';
print(random_int(-999, -1));//随机-357

11. use 语句

可以使用单个use语句从相同的命名空间导入类,函数和常量,而不是使用多个use语句.


 //PHP7之前 
use some\namespace\ClassA; 
use some\namespace\ClassB; 
use some\namespace\ClassC as C; 
use function some\namespace\fn_a;
use function some\namespace\fn_b; 
use function some\namespace\fn_c; 
use const some\namespace\ConstA; 
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP7之后
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

12. intp

新增加intp()函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整.


echo intp(8,4);//2
echo intp(10,4);//2
echo intp(5,10);//0

13. PHP7 错误处理


PHP7 改变了大多数错误的报告方式.不同于PHP5的传统错误报告机制,现在大多数错误被作为Error异常抛出.


这种Error异常可以像普通异常一样被try / catch块所捕获. 如果没有匹配的try / catch块,则调用异常处理函数(由 set_exception_handler() 注册)进行处理.
如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error).


Error类并不是从Exception类扩展出来的,所以用catch (Exception $e) { ... } 这样的代码是捕获不到Error的.你可以用 catch (Error $e) { ... } 这样的代码,
或者通过注册异常处理函数( set_exception_handler())来捕获Error.


  <?php 
  //php7以前 自定义异常处理 
  class getException extends Exception{ 
      public function errorMsg(){ 
          return &#39;错误的信息&#39;.$this->getMessage().'<br>错误的代码'.$this->getCode(); 
      } 
  } 
   
  try {
      $num =10;
      if($num > 1) {
          throw new getException($num,404);
      }
  } catch (getException $e) {
      echo $e->errorMsg();
    }


 <?php  
 //php7 异常处理
 try {
     test();
 }catch(Error $e) {
     echo $e->getMessage();//Call to undefined function test()
      }

 相关推荐:《PHP教程

以上是php7新特性的理解和比较的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:cnblogs。如有侵权,请联系admin@php.cn删除
如何在PHP 7中有效使用会议?如何在PHP 7中有效使用会议?Mar 10, 2025 pm 06:20 PM

本文详细介绍了有效的PHP 7会话管理,涵盖了session_start(),$ _Session,session_destroy()和安全cookie处理等核心功能。 它强调了安全性最佳实践,包括HTTP,会话ID再生,S

如何使用New Relic等工具监视PHP 7的性能?如何使用New Relic等工具监视PHP 7的性能?Mar 10, 2025 pm 06:28 PM

本文解释了如何使用新遗物监视PHP 7应用程序性能。 它详细详细介绍了新的Relic的设置,关键绩效指标(KPI),例如APDEX分数和响应时间,通过交易轨迹的瓶颈标识和错误轨迹

如何从PHP 5.6升级到PHP 7?如何从PHP 5.6升级到PHP 7?Mar 10, 2025 pm 06:29 PM

本文详细介绍了将PHP 5.6升级为PHP 7,强调了备份,检查服务器兼容性以及选择升级方法(软件包管理器,编译,控制面板或Web服务器配置)等关键步骤。 它解决了Potentia

如何在PHP 7中自动加载课程?如何在PHP 7中自动加载课程?Mar 10, 2025 pm 06:20 PM

本文使用SPL_AUTOLOAD_REGISTER()解释了PHP 7的自动加载,以按需加载类。 它详细介绍了最佳实践,例如基于命名空间的自动加载和用于性能优化的缓存,解决了常见问题(例如,找不到类别

如何在PHP 7项目中使用GIT进行版本控制?如何在PHP 7项目中使用GIT进行版本控制?Mar 10, 2025 pm 06:27 PM

本文指导PHP 7开发人员使用GIT进行版本控制。 它涵盖了初始化,分期,投入,忽略文件,远程存储库,分支,合并,解决冲突和基本的GIT命令。 效率的最佳实践

如何将PHP 7应用程序部署到Web服务器?如何将PHP 7应用程序部署到Web服务器?Mar 10, 2025 pm 06:28 PM

本文详细介绍了部署PHP 7应用程序,涵盖方法(FTP,SSH,部署工具),服务器配置(Apache/nginx,php-fpm),数据库设置和重要的安全考虑因素。 它突出了服务器compatib等常见挑战

如何使用Xdebug进行调试PHP 7代码?如何使用Xdebug进行调试PHP 7代码?Mar 10, 2025 pm 06:26 PM

本文说明了如何使用Xdebug进行调试PHP 7代码。 它涵盖Xdebug配置(安装,php.ini设置,IDE设置),断点用法(条件,功能,远程)和故障排除连接问题。 有效的Debuggi

PHP 7中的面向对象的编程(OOP)是什么?PHP 7中的面向对象的编程(OOP)是什么?Mar 10, 2025 pm 02:53 PM

本文在PHP 7中解释了面向对象的编程(OOP),强调了其优势:模块化,可重复性,可维护性和改进的代码组织。 它详细说明了类,对象,继承和多态性,以说明其使用

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境