资讯专栏INFORMATION COLUMN

PHP7新特性的介绍

klivitamJ / 1847人阅读

摘要:截止到目前为止,官方已经发布了的版本,距离发布第一个正式版本不会很远了现在来说的重大特性肯定已经是定型了,不会再有什么变动了。

截止到目前为止,PHP官方已经发布了php7的RC7版本,距离发布第一个正式版本不会很远了!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了。后续一些版本的迭代主要也就是修修bug,优化之类的。下面就来说话我们一直期待的php7会有那些主要的变化了。。。

关于PHP

20年的发展历史;

迄今为止最流行的WEB开发语言;

超过82%的网站都会使用PHP作为他们的服务端开发语言;

新特性介绍

PHP NG – Zend Engine 3

抽象语法树

64位的 INT 支持

统一的变量语法

新增Closure::call()

一致性foreach循环

匿名类的支持

新增 <=>**??u{xxxx}操作符

增加了返回类型的声明

增加了标量类型的声明

核心错误可以通过异常捕获

增加了上下文敏感的词法分析

PHP NG

ZVAL

大小从24字节减少到16字节

Zend Array(HashTable)

HashTable大小从72字节减少到56字节
HashTable bucket大小从72字节减少到32字节

函数调用的优化

使用了新的内存分配,管理方式,减少了内存的浪费

Immutable array optimization

$arr = [];

for($i=0; $i<100000; $i++) {
    $arr[] = ["php"];
}

p(memory_get_usage(true));

PHP5: 45M
PHP7: 10M

一些非常常用,开销不大的的函数直接变成了引擎支持的opcode

call_user_function(_array) => ZEND_INIT_USER_CALL
is_intis_stringis_array、... => ZEND_TYPE_CHECK
strlen => ZEND_STRLEN
defined => ZEND+DEFINED

核心排序的优化

PHP5(zend_qsort
快速排序(非稳定排序)

array(1 => 0, 0 => 0)

PHP7(zend_sort
快速排序+选择排序(稳定排序)

array(0 => 0, 1 => 0)

小于16个元素的使用选择排序,大于16个按照16个为单位去分割,分别使用选择排序,然后再全部合起来使用快速排序。排序较之前相比,内部元素由非稳定排序变成稳定排序,减少元素的交换次数,减少对内存的操作次数,性能提升40%

抽象语法树

假如现在我们有这样的需求,要对php源文件就行语法检测,实现编码规范。php5之前的话,没有AST,直接从parser就生成了opcodes!就需要借助一些外部的php语法解析器来实现;而php7增加了AST,我们可以自己去实现这样一个扩展,利用扩展提供的函数可以直接获取文件对应的的AST结构,而这样的结构正是我们可以识别的,所以就可以在这个基础上去做一些优化和判断了。

64位的INT支持

支持存储大于2GB的字符串

支持上传大小大于2GB的文件

保证字符串在所有平台上【64位】都是64bit

统一的语法变量
$$foo["bar"]["baz"] 

PHP5: ${$foo[‘bar’]["baz"]}
PHP7: ($$foo)[‘bar’][‘baz"]【从左至右法则】

(function() {})();
$foo()();
[$obj, "method"]();

class A {
    public static function a1() {}
}

[new A, "a1"]();
新增Closure::call()
$f = function() {
    p($this->name);
};

class F {
    private $name = "F";
}

$f->call(new F);
匿名类的支持
function getAnonymousClass($config) {
    return new class(config) {};
 }

p(getAnonymousClass(array()));
一致性的foreach循环
//PHP5
$a =  array(1, 2, 3);foreach ($a as $v){var_dump(current($a));}
int(2)
int(2)
int(2)

$a =  array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a));}
int(2)
int(3)
bool(false)

$a =  array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a));}
int(1)
int(1)
int(1)

//PHP7:不再操作数据的内部指针了
$a =  array(1, 2, 3);foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

$a =  array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a))
int(1)
int(1)
int(1)

$a =  array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)
新增的几个操作符

<=>

//PHP5
function compare($a, $b) {
    return ($a < $b) ? -1 : (($a >$b) ? 1 : 0);
}
//PHP7
function compare($a, $b) {
    return $a <=> $b;
}

**

2 ** 2; // 2 * 2 = 4
2 ** -1; // 1 / 2 = 0.5
3 ** -2; // 1 / 9 = 0.111111111

??

$a = null;
$b = 1;
$c = 2;
echo $a ?? $b , ‘,’ , $c ?? $b; // 1,2
echo $a ?? $b ?? $c  , ‘,’ , $a ?? $d ?? $c; // 1,2

u{xxxx}

echo "u{4f60}";//你
echo "u{65b0}";//新
// 从右至左强制
echo"u{202E}iabgnayu{1F602}";;
? yangbai
返回类型的声明
function getInt() : int {
    return "test";
}; 

getInt();

//返回值为DateTime的函数
function getDateTime() : DateTime {
    return new DateTime();
}; 
标量类型的声明
function getAmount(int $num) : int {
    return $num;
}; 

getAmount("test");

//PHP5
#PHP Catchable fatal error:  Argument 1 passed to getInt() must be an instance of int, string given…

//PHP7
#Fatal error: Uncaught TypeError: Argument 1 passed to getInt() must be of the type integer, string given…

getAmount("123");
#PHP7新增的严格模式选项开启下也会报错【declare(strict_types=1),注意要放到代码的第一行】
核心错误可以通过异常捕获了
try {
    non_exists_func();
} catch(EngineException $e) {
    echo "Exception: {$e->getMessage();}
";
} finally {
    echo "undefined function…";
}

//这里用php7试了一下没有捕获成功【但是确实抛出了异常】。。。
#Exception: Call to undefined function non_exists_func()
上下问敏感的词法分析
//PHP5
class Collection {public function foreach($arr) {}}
#Parse error:  parse error, expecting `"identifier (T_STRING)”’...

//PHP7
class Collection {
    public function foreach($arr) {
        return $this;
    }
    public function in($arr){
        return $this;
    }
    public function sort($condition){
        return $this;
    }
    public function echo($condition){
        return "ok";
    }
}
$collection = new Collection();
$collection->in()->foreach()->sort()->echo();
打破的一些东西

mysql、ereg

mysql 移到了 ext/pecl 中去了,ereg 移到了 ext/pcre

isapi、tux etc SAPIs

 

HTTP_RAW_POST_DATA移除了(可以使用php://input替代)

$o = & new className(),不再支持这样的写法

mktime()gmmktime() 函数的$is_dst 参数被移除了

setlocale()函数的$category参数不支持字符串了,必须是LC开头的常量

php.ini文件移除了#作为注释,统一用;去注释

函数定义同名参数不支持了

类的同名构造函数不推荐(目前没有移除,后续会去掉)

Stringintfloat等这些关键字不能被作为类、接口、trait的名称使用了

func_get_arg/func_get_args获取的是当前变量的值

无效的八进制数字会产生编译错误

preg_replace()不再支持匹配模式/e

16进制的字符串数字转换被移除了

不再支持静态调用一个不兼容的$this上下文的非静态调用

Unsafe curl file uploads (use CurlFile instead)

//PHP5
curl_setopt(ch, CURLOPT_POSTFIELDS, array(
    "file" => "@".realpath("image.png"), 
)); 

//PHP7
curl_setopt(ch, CURLOPT_POSTFIELDS, [
    "file" => new CURLFile(realpath("image.png")), 
]); 

一些移除的函数和选项

set_magic_quotes_runtime();
magic_quotes_runtime();

//(use stream_set_blocking() instead)
set_socket_blocking();

//(use mcrypt_generic_deinit() instead)
mcrypt_generic_end();

//(use mcrypt_encrypt() and mcrypt_decrypt() instead)
mcrypt_ecb();
mcrypt_cbc();
mcrypt_cfb();
mcrypt_ofb();

//(use datefmt_set_timezone() or IntlDateFormatter::setTimeZone() instead)
datefmt_set_timezone_id();
IntlDateFormatter::setTimeZoneID();

//(use XsltProcessor::setSecurityPrefs() instead)
xsl.security_prefs;//php.ini 

//(use php.input_encoding、php.internal_encoding and php.output_encoding instead)
iconv.input_encoding;
iconv.output_encoding;
iconv.internal_encoding;
mbstring.http_input;
mbstring.http_output;
mbstring.internal_encoding;

(use PDO::ATTR_EMULATE_PREPARES instead)
PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT;//driver option 
 
//(use peer_name instead)
CN_match;//SSL context options 
SNI_server_name;//SSL context options 

差不多了,夜已深、人已困!
更多、更详细的介绍请猛戳 这里

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21175.html

相关文章

  • PHP7源码分析】PHP7到底有多快,基准测试与特性分析告诉你

    摘要:我们修改上面代码,再来看下返回值类型限制的情况运行结果这段代码我们额外声明了返回值的类型为型。对函数返回值的声明做了扩充,可以定义其返回值为,无论是否开启严格模式,只要函数中有以外的其他语句都会报错。 顺风车运营研发团队 王坤 发表至21CTO公众号(https://mp.weixin.qq.com/s/ph...) showImg(https://segmentfault.c...

    Towers 评论0 收藏0
  • PHP7特性介绍

    摘要:本文内容根据发布时的而来,链接地址特性一览新的操作符之前的写法比较两个数的大小新增的操作符可以直接使用这种方式输出字符这个是方括号里面的问号,因为是字符,博客不支持,发布出来新增的一个函数,具体功能没有深入研究变量类型声明与之相关的一个语 本文内容根据PHP发布时的 new files 而来,链接地址 : PHP 7 new 特性一览 Added ?? operator Adde...

    icyfire 评论0 收藏0
  • 【天赢金创】PHP7与Swoole

    摘要:但在密集计算方面比等静态编译语言差几十倍甚至上百倍。一使用栈内存在引擎和扩展中,经常要创建一个的变量,底层就是一个指针。代码中创建的变量也进行了优化,直接在栈内存上预分配。应用层与底层在错误抛出的方式全部统一为异常。 原文:http://rango.swoole.com/archives/440最近PHP官方终于发布了传说中的PHP7,虽然只是alpha版。PHP7号称是新一代的PHP...

    MingjunYang 评论0 收藏0
  • PHP7.1_特性

    摘要:性能优化使用栈内存在引擎和扩展中,经常要创建一个变量,底层就是一个指针。而可以直接使用栈内存作用节省一次内存分配和管理存储值,查询不需要重复计算为字符串单独创建了新类型叫做,除了指针和长度之外,增加了一个字段,用于保存字符串的值。 变量类型 PHP7版本函数的参数和返回值增加了类型限定。原因:为了PHP7.1版本JIT特性做准备,增加类型之后PHP, JIT可以准确判断变量类型,生成最...

    xiao7cn 评论0 收藏0
  • PHP7特性

    摘要:主要的变化有以下几点抽象语法树在之前的版本中,代码在语法解析阶段直接生成了指令,也就是在中直接生成指令,这使得编译器与执行器耦合在一起。 PHP7 从发布到现在已经有快三年的时间了,现在已经发展到 PHP7.2.9 版本了。它的发布给 PHP 带来了很大的性能提升,这主要是得益于 PHP 对 Zend 引擎的深度优化,同时还降低了 PHP 对系统的资源占用。 主要的变化有以下几点: 抽...

    Honwhy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<