php 7 的新特性

1,类型得声明

可以使用字符串(string),整数(int),浮点数(float)以及布尔值(bool),来声明参数类型和函数返回值

例:declare(strict_types=1);

       function add(int $a,int $b): int{

               return $a+$b;  

     }

     echo add(1 , 2);

     echo add(1.5 , 2.5);

    php5无法执行上面得代码,php7执行得时候先输出3和一个报错(Argument 1 passed to add() must be of the type integer, float given);

   标量类型声明有两种模式:强制(默认)和严格模式

   declare(strict_types = 1) 必须放在文件得第一行执行代码,当前文件有效。//开启严格模式

2,set_exception_hander()不在保证收到的都是Exception对象    //捕捉异常

 在php7中,很多致命错误以及可恢复的致命错误,都被转化为异常来处理。这些异常承自Error类,此类实现了Throwable接口(所有异常都实现了这个基础接口)

php7进一步方便开发者处理,让开发者对程序的掌控能力更强,因为在默认情况下,Error会直接导致程序中断,而php7提供了直接捕获和处理的能力让程序继续执行下去,提供更灵活的选择

set_exception_hander('myexception'); //设置用户自定义的异常的处理函数

3,新增操作符<=>

语法$c=$a<=>$b

如果$a>$b,则$c的值1;

如果$a==$b,则$c的值0;

如果$a<$b,则$c的值为-1

4,新增操作符??

如果存在且不为null,则返回自身的值,否则返回第二个操作数

$username = isset($_GET['user'])?$_GET['user']:0;

$username = $_GET['user'] ?? 0 ;

5,定义常量数组

define("ARR",['a','b']);

echo ARR[1];

6,AST : Abstrict Syntax Tree 抽象语法树

 AST在php的编译过程中是作为中间件的角色,替换原来直接从解释器中吐出的opcode的方式,让解释器(parser)和编译器(compliler)解耦,可以减少一些HACK代码,同时,让实现更容易理解和可维护

PHP5 : PHP代码 -> Parser语法解析 -> OPCODE -> 执行 
PHP7 : PHP代码 -> Parser语法解析 -> AST -> OPCODE -> 执行

7,匿名函数

$anom_fun = function(){

       return 'function';

}

echo $anom_fun();

8,Unicode字符格式支持(echo "\u{9999}")

9,unserialize提供过滤特性

防止非法数据进行代码注入,提供更安全的反序列化数据

10,命名空间引用优化

php7以前的写法

use FooLibrary\Bar\Baz\ClassA;

use FooLibrary\Bar\Baz\ClassB;

php7的写法  use FooLibrary\Bar\Baz\{ClassA , ClassB}

php7带来的废弃

1,废弃扩展

Ereg表达式

mssql //sql server 数据库服务器

mysql

sysbase_ct

2,废弃得特性

不能使用同名的构造函数 (  php7之后构造函数只能是__constract())

实例方法不能用静态方法得方法调用

3,废弃得函数

方法调用  

call_user_method();call_user_method_array();

应该采用  

call_user_func(); call_user_func_array(); //把第一个参数作为回调函数,其他都是作为参数调用

加密相关函数

mcrypt_generic_end();

mcrypt_ecb();

mcrypt_cbc();

mcrypt_cfb();

mcrypt_ofb();

注意:php7以后mcrypt_*一系列函数都将被移除,推荐使用oppenssl序列函数

杂项

set_magic_quotes_runtime   //转移函数

set_socket_blocking  //为资源设置阻塞或阻塞模式

split   //用正则表达式将字符串分割到数组中

//图像函数集

imagepsbbox()

imagepsencodefont()

iamgepsextendfont()

imagepsfreefont()

imagepsloadfont()

imagepsslantfong()

imagepstext()

废弃的变量

$HTTP_RAW_POST_DATA 变量被移除 ,用php://input代替

ini文件不再支持#开头的注释,而是用“ ; ”

移除了ASP语法的支持和脚本语法的支持  <% 和<script language = 'php'>

 php7带来的变更

1,字符串处理机制修改

含有十六进制的字符串不再视为数字,也不再区别对待

例 :var_dump("ox123"==291); // false

         var_dump(is_numeric('ox123')) //false

         var_dump("0xe"+‘ox1‘); // 0

         var_dump(substr("fool","0x1")); // fool

2,整型处理机制修改

int64支持,统一不同平台下的整形长度,字符串和文件都支持上传大于2GB.64位php7字符串长度可以超过2^31次方字节

3,参数处理机制修改

不支持重复参数命名

function func($b,$c); 会报错

func_get_arg()和func_get_args() 这两个方法返回参数当前值,而不是传入时的值,当前的值可能被修改

所以需要注意,在函数第一行就记录下来,否则后续有修改,在读取就不是传进来的初始值

function foo($x){

   $x++;

   echo function_get_arg(0);

}

foo(1);返回2

5,foreach修改

foreach循环对数组内部指针不再起作用

$arr = [1,2,3];

foreach($arr as &$v){

      echo current($arr);//php7 全返回0

}

按照值进行循环的时候,foreach是 对该数组的拷贝操作

$arr = [1,2,3];

foreach($arr as $val){

    unset($arr[1]);

}

var_dump($arr);

最新的php7会打印出[1,2,3]

老的会打印出[1,3]

按照引用进行循环的时候,对数组的修改会影响循环

$a = [1];

foreach($arr as $val){

    var_dump($arr);

    $arr[1]=2;

}

最新的php7依旧会追加新增元素的循环

5,list修改

不再按照相反的顺序赋值

list($arr[],$arr[],$arr[]) = [1,2,3]  // $arr将会是[1,2,3],而不是以前的[3,2,1]

不再支持字符串的拆分功能

// $x=null 并且 $y=null'

$str = "xy";

list($x,$y) =$str:

空的list赋值不再允许

list() = [123];

list()现在也适用于数组对象

list($a,$b) = (object) new ArrayObject( [0,1]);

6,变量处理机制修改

对变量,方法和属性的间接调用现在将严格遵守从左到右的顺序来解析,而不是之前的混杂几个案例的情况

引用赋值时自动创建的数组元素和对象属性顺序和以前不同了

$arr = [];

$arr['a'] = &$arr[b]

$arr[b] = 1;

//php7 :['a'=>1,"b"=>1]

//php5: ["b"=>1,"a"=>1]

 7,杂项

   1》debug_zval_dump();现在打印  int  代替 long  打印float替代double

   2》dirname()增加了可选的第二个参数depth,获取当前目录向上depth级父级目录名

   3》getrusage() 现在支持window.mktime和gmmktime()函数不再支持is_dst参数

   4》preg_replace() 不再支持\e(PREG_REPLACE_EVAL) 应当使用 preg_replace_callback()代替

   5》setlocal() 不再支持 category传入字符串,应使用LC_*常量

   6》exec(),system() and passtru()函数对null增加保护

   7》shmop_open()现在返回一个资源而非int,这个资源可以传给 shmop_size(),shmop_read(),shmod_close(),shmop_write()和shmop_delete()

   8》为了避免内存泄漏,现在set_xml_object()现在执行结束时需要手动清楚$parse

   9》curl_setopt 设置项 CURLOPT_SEFE_UPLOAD变更

         TRUE禁用 @ 前缀在CURLOPT_POSTFILEDS发送文件。意味着@可以在字段中安全使用了。可使用CURFILE作为上传替代

         php5.5添加了默认值false,php5.6变更默认值位True,php7删除了此选项,必须使用CURLFILE interface来上传文件

   如何充分发挥php7的新特性

 1,开启Opcache

   zend_extension=opcache.so

  opcache_enable = 1

  opcache_enable_cli =1

2,使用GCC4.8进行编译

   只有GCC4.8以上php才会开启  GLObal Registr for opline and execute_data 支持,这个会带来5% 的性能提升

3,HugePage根据系统内存决定

 

 

  4,PGO(Profile  Guided Optimization)

 第一次编译成功后,用项目去训练php,会产生一些profile信息,最后根据这些信息进行第二次gcc编译php就可以得到量身订做的php7

需要选择在你的优化场景中,访问量最大,耗时最多,资源消耗最终的一个页面

如何更好迎接php7

1,不适用废弃的php方法,扩展

2,使用两个版本都兼容的语法特性【list,foreach,func_get_arg等】’

检测工具:https://github.com/sstalle/php7cc

原文 https://blog.csdn.net/wuxing26jiayou/article/details/80036963

 

转载于:https://www.cnblogs.com/shangfz/p/11226558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值