您的足迹:首页 > 读书笔记 >php新特性总结

php新特性总结

PHP7在2015年10月正式发布,是PHP脚本语言的重大版本更新,同时带来大幅的性能改进和新的特性,以及改进一些过时功能。 该 发布版本专注在性能加强,源自PHP版本树中的phpng分支。
PHP7 移除了已经被废弃的函数,如 mysql_ 系列函数在 PHP5.5 被废弃,在 PHP7 被删除。
PHP7 的性能高于 HHVM 。并且是 PHP5.6 的两倍。
新增新特性:
1.ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG
2.增加抽象语法树,使编译更加科学
3.64位的INT支持
4.统一的变量语法
5.原声的TLS - 对扩展开发有意义
6.一致性foreach循环的改进
7.新增 <=>、**、?? 、\u{xxxx}操作符
8.增加了返回值类型的声明
9.增加了标量类型的声明
10.核心错误可以通过异常捕获了
11.增加了上下文敏感的词法分析

移除的一些特性
1.移除一些旧的扩展,被移迁移到了PECL(例如:mysql)
2.移除SAPIs的支持
3.
4.16进制的字符串转换被废除了
//PHP5
"0x10" == "16"
//PHP7
"0x10" != "16"
5.HTTP_RAW_POST_DATA移除了(可以使用php://input替代)
6.静态函数里面不再支持通过一个不兼容的$this调用一个非静态的函数了
$o = & new className{},不再支持这样的写法
7.php.ini文件移除了#作为注释,统一用;去注释

1.PHP NG
新的php引擎优化了很多地方,也正式因为如此,才使得php7相对于php5性能有了接近两倍的提升!
ZVAL结构的重构
PHP5的zval(24字节),PHP7的zval(16字节);
在PHP5的时候, zval的定义如下:
struct _zval_struct { union { long lval; double dval; struct { char *val; int len;
        } str;
        HashTable *ht;
        zend_object_value obj;
        zend_ast *ast;
    } value;
    zend_uint refcount__gc;
    zend_uchar type;
    zend_uchar is_ref__gc;
};
PHP7的zval
struct _zval_struct { union {
        zend_long         lval; /* long value */ double dval; /* double value */ zend_refcounted  *counted;
        zend_string      *str;
        zend_array       *arr;
        zend_object      *obj;
        zend_resource    *res;
        zend_reference   *ref;
        zend_ast_ref     *ast;
        zval             *zv; void *ptr;
        zend_class_entry *ce;
        zend_function    *func; struct { uint32_t w1; uint32_t w2;
        } ww;
    } value; union { struct { ZEND_ENDIAN_LOHI_4(
                zend_uchar    type, /* active type */ zend_uchar    type_flags,
                zend_uchar    const_flags,
                zend_uchar    reserved) /* call info for EX(This) */ } v; uint32_t type_info;
    } u1; union { uint32_t var_flags; uint32_t next; /* hash collision chain */ uint32_t cache_slot; /* literal cache slot */ uint32_t lineno; /* line number (for ast nodes) */ uint32_t num_args; /* arguments number for EX(This) */ uint32_t fe_pos; /* foreach position */ uint32_t fe_iter_idx; /* foreach iterator index */ } u2;
};
php7的zval要比php5还要复杂,但是却能从24个字节下降到16个字节:
(1)在C语言中struct的每一个成员变量要各自占据一块独立的内存空间,而union里的成员变量是共用一块内存空间(php7中大量使用union替换了struct)。因此,虽然成员变量看起来多了不少,但是实际占据的内存空间有很多都是公用的却下降了。
(2)使用新的Zend Array替换之前的HashTale结构
我们php程序中使用最多、最有用、最方便、最灵活的就是数组了,而php5它的底层就是HashTable实现的,php7使用了新的Zend Array类型,性能和访问速度上都有了大幅度提升!
一些非常常用,开销不大的的函数直接变成了引擎支持的opcode
call_user_function(_array) => ZEND_INIT_USER_CALL
is_int/string/array/* => ZEND_TYPE_CHECK
strlen => ZEND_STRLEN
defined => ZEND+DEFINED
(3)使用了新的内存分配,管理方式,减少了内存的浪费
核心排序zend_sort的优化
//PHP5 - 快速排序(非稳定排序)
array(1 => 0, 0 => 0)
//PHP7 - 快速排序+选择排序(稳定排序)
array(0 => 0, 1 => 0)
小于16个元素的使用选择排序,大于16个按照16个为单位去分割,分别使用选择排序,然后再全部合起来使用快速排序。排序较之前相比,内部元素由非稳定排序变成稳定排序,减少元素的交换次数,减少对内存的操作次数,性能提升40%;
(4)php7增加了AST,我们可以自己去实现这样一个扩展,利用扩展提供的函数可以直接获取文件对应的的AST结构,而这样的结构正是我们可以识别的,所以就可以在这个基础上去做一些优化和判断了。php5之前的话,没有AST,直接从parser就生成了opcodes!就需要借助一些外部的php语法解析器来对php源文件就行语法检测,实现编码规范;
什么是opcode缓存?
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache的目地是避免重复编译,减少CPU和内存开销。
AST(Abstract Syntax Tree,抽象语法树)
AST在PHP编译过程作为一个中间件的角色,替换原来直接从解释器吐出opcode的方式,让解释器(parser)和编译器(compliler)解耦,可以减少一些Hack代码,同时,让实现更容易理解和可维护。


7新增的几个操作符
null合并运算符:由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
太空船操作符(组合比较符):太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。?
 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
通过 define() 定义常量数组:Array 类型的常量现在可以通过 definedefine() 来定义。在 PHP5.6 中仅能通过 const 定义。
8.标量类型声明:标量类型声明 有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。

9.返回值类型声明:返回类型声明指明了函数返回值的类型,可用的类型与参数声明中可用的类型相同。
PHP 7 增加了一个 declare 指令:strict_types,既使用严格模式。
使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError 的 Fatal error。
强制模式:
10.PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:
但还是要写出每个类或函数或 const 的名称(并没有像 python 一样的 from some import * 的方法)。
需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。

相关推荐

网友评论(0)