浅谈php7的重大新特性_php技巧_脚本之家,7的步骤
分类:计算机编程

前言

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

问题描述

在air上,用MySQLi方式连接数据库就出现这个问题了,原来是mac系统配置MySQL环境的时候丢失系统的mysql.socket造成的,大概的意思就是。你用php连接MySQL的时候,需要一个mysql.socket文件,但是这个文件并没有能够正确的在你的php.ini文件中映射,路径不对,暂且这么理解吧,我不求甚解了。

错误

在MAC OS X 10.11中php的版本是5.5的,近来一年多里,看到了很多关于php7介绍,以为php7增加了很多新特性,也删除了原来很多的老特性,所以一直以来并没想去尝试使用php7,但今天去php官网上认真的看了一下php7的新特性,发现其实php7最大的提升在于性能,虽然在语法上增加了很多新特性,但不影响开发,并且能很好的兼容以前php的代码,在这里简要的说明一下php7的新特性,具体的说明请移步到官网去看。

新特性预览

环境

操作系统:mac os

Connection failed: SQLSTATE[HY000] [2002] No such file or directory

移除的一些特性

ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG增加抽象语法树,使编译更加科学64位的INT支持统一的变量语法原声的TLS - 对扩展开发有意义一致性foreach循环的改进新增 <=>、**、?? 、u{xxxx}操作符增加了返回类型的声明增加了标量类型的声明核心错误可以通过异常捕获了增加了上下文敏感的词法分析

解决方案

1、找到php.ini find / -name php.ini
2、然后找到pdo_mysql.default_socket,mysql.default_socket,mysqli.default_socket你会发现他们后面的值是空的,或者带有什么路径的值。
3、用phpinfo()函数查看扩展中pdo.mysql,mysqli中所用的mysql.sock连接是什么。跟第二部进行对比。
4、找到文件find / -name mysql.sock 然后你会发现这个mysql.sock的文件的位置就在 /private/tmp/mysql.sock 。接着,我们把这个路径替换到第二步骤中那些socket连接后面去:
pdo_mysql.default_socket=/private/tmp/mysql.sock
mysql.default_socket = /private/tmp/mysql.sock
mysqli.default_socket = /private/tmp/mysql.sock
当然,这个路径我只是示例,具体看你服务器上的mysql.sock文件到路径位置了。
5、重启Apache服务器:sudo /usr/sbin/apachectl restart 来刷新php.ini文件。
6、验证,再次使用phpinfo()函数输出,查看上面提到的几个值,看看是否有了变化。
7、开始连接,可以参考我的mysqli连接MySQL的文章。现在就不会报错了

环境概述:

1.移除一些旧的扩展,被移迁移到了PECL

移除的一些特性

footer

虽然问题解决了,但是对mysq.sock文件和php.ini文件,还有众多配置的问题不是真的弄懂。先记录一下吧。QAQ

MacOS
xampp 搭建的开发环境 apache mysql php
xampp 已支持mysql oracle 测试ok,且 phpinfo已上显示支持pdo_mysql pdo_pgsql pdo_sqlite
其中mysql我用的是brew包管理安装到机器里面的,而非xampp自带的mysql

2.移除SAPIs的支持

1.移除一些旧的扩展,被移迁移到了PECL2.移除SAPIs的支持3.

php pdo 连接报错 Connection failed: SQLSTATE[HY000] [2002] No such file or directory
开始以为找不到文件是因为 url rewrite导致的,(因为从nginx切换到apache)结果跟踪程序发现是 new pdo 报错

3.和这样的标签被移除了

//PHP5"0x10" == "16"//PHP7"0x10" != "16"

经过搜索一些资料研究发现:

4.16进制的字符串转换被废除了

5.HTTP_RAW_POST_DATA移除了6.静态函数里面不再支持通过一个不兼容的$this调用一个非静态的函数了$o = & new className{},不再支持这样的写法7.php.ini文件移除了#作为注释,统一用;去注释

这个是php.ini配置文件中pdo_mysql.default_socket指定的mysql.sock路径不对
我的mysql.sock文件在 /private/tmp/mysql.sock
所以要设置:

//PHP5"0x10" == "16" //PHP7"0x10" != "16"

一些行为的改变

pdo_mysql.default_socket=/private/tmp/mysql.sock

5.HTTP_RAW_POST_DATA移除了

不在支持函数定义同名参数类型的同名构造函数不推荐使用了String、int、float等这些关键字不能被作为类名使用了func_get_args()获取的是当前变量的值

如果不知道自己的mysql.sock在哪里可以搜索(因为编译安装,和yum、apt-get、或者brew等包管理工具安装的位置不一样)

6.静态函数里面不再支持通过一个不兼容的$this调用一个非静态的函数了

function test  { $num  ; var_dump;};test//PHP7int

sudo find / -name ‘mysql.sock’

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

下面就挑选了一些主要的、核心的、对我们PHPer来说比较重要的特性介绍一下

下面是官方给出bug修复

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

PHP NG

  1. Open up php.ini (mine was in /private/etc/)
  2. locate this line: pdo_mysql.default_socket=/var/mysql/mysql.sock
  3. Change the line to: pdo_mysql.default_socket=/tmp/mysql.sock
  4. Restart apache

新特性

新的php引擎优化了很多地方,也正式因为如此,才使得php7相对于php5性能有了接近两倍的提升!

1、我这里需要补充下,如果是新系统或者刚玩php的同志,在Mac的系统中php.ini 文件不存在,

ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG 增加抽象语法树,使编译更加科学 64位的INT支持 统一的变量语法 原声的TLS - 对扩展开发有意义 一致性foreach循环的改进 新增 <=>、**、?? 、u{xxxx}操作符 增加了返回类型的声明 增加了标量类型的声明 核心错误可以通过异常捕获了 增加了上下文敏感的词法分析

左边是PHP5的zval,右边是PHP7的zval;

2、需要在/private/etc/目录下cp  php.ini.default
php.ini ,然后再做修改下,

说了这么多的废话,进入主题吧。

可以看出来php7的zval要比php5还要复杂,但是却能从24个字节下降到16个字节,为什呢?

3、但是如果使用的xampp mysql作为数据库,那么就不需要使用官方的step2,直接写下面方式就可以了。

升级步骤如下:

在C语言中struct的每一个成员变量要各自占据一块独立的内存空间,而union里的成员变量是共用一块内存空间(php7中大量使用union替换了struct)。因此,虽然成员变量看起来多了不少,但是实际占据的内存空间有很多都是公用的却下降了。

pdo_mysql.default_socket=/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

curl -s http://php-osx.liip.ch/install.sh | bash -s 7.1

使用新的Zend Array替换之前的HashTale结构

 
解决方法三

在终端下直到出现”Syntax OK”就说明安装成功了。这个时候,用phpinfo()函数,你可以看到PHP Version 7.1.0alpha2

我们php程序中使用最多、最有用、最方便、最灵活的就是数组了,而php5它的底层就是HashTable实现的,php7使用了新的Zend Array类型,性能和访问速度上都有了大幅度提升!一些非常常用,开销不大的的函数直接变成了引擎支持的opcode

sudo vim /etc/php.ini

2、解决mysql链接的问题,由于php7抛弃了mysql的扩展函数,所有的链接mysql都要使用pdo,而php7的pdo_mysql.default_socket默认路径是/tmp/mysql.sock,而mysql.sock的路径在/private/var/mysql/mysql.sock,所以需要做一个软连接到tmp文件夹,在终端下执行

call_user_function => ZEND_INIT_USER_CALLis_int/string/array/* => ZEND_TYPE_CHECKstrlen => ZEND_STRLENdefined => ZEND DEFINED

把以下三个原来空白的值都设置为 /tmp/mysql.sock

cd /tmpsudo ln -s /private/var/mysql/mysql.sock mysql.sock

使用了新的内存分配,管理方式,减少了内存的浪费核心排序zend_sort的优化

mysql.default_socket = /tmp/mysql.sock
pdo_mysql.default_socket= /tmp/mysql.sock
mysqli.default_socket =/tmp/mysql.sock
 
都修改了
修改完成后使用
sudo /usr/sbin/apachectl restart

如果解决以上错误,php链接数据库时会提示:SQLSTATE[HY000] [2002] No such file or directory

//PHP5 - 快速排序array//PHP7 - 快速排序 选择排序array

 

3、重启apache和mysql,这样就可以啦!

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

总结

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

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

64位的INT支持

支持存储大于2GB的字符串支持上传大小大于2GB的文件保证字符串在所有平台上都是64bit统一的语法变量

$$foo['bar']['baz']//PHP5[‘bar']['baz']//PHP7: 遵循从左到右的原则${$foo[‘bar']['baz']}

foreach循环的改进

//PHP5$a = array;foreach {var_dumpint$a = array;$b=&$a;foreach {var_dumpint$a = array;$b=$a;foreach {var_dumpint//PHP7:不再操作数据的内部指针了$a = array;foreach {var_dumpint$a = array;$b=&$a;foreach {var_dumpint$a = array;$b=$a;foreach {var_dumpint

//<=> - 比较两个数的大小【-1:前者小于后者,0:前者等于后者,1:前者大于后者】echo 1 <=> 2;//-1echo 1 <=> 1;//0echo 1 <=> 0;//1// ** - echo 2 ** 3;//8//?? - 三元运算符的改进//php5$_GET['name'] ? $_GET['name'] : '';//Notice: Undefined index: …//php7$_GET['name'] ?? '' -> '';//u{xxxx} - Unicode字符的解析echo "u{4f60}";//你echo "u{65b0}";//新

function getInt() : int { return “test”;};getInt();//PHP5#PHP Parse error: parse error, expecting '{'...//PHP7#Fatal error:Uncaught TypeError: Return value of getInt() must be of the type integer, string returned 

function getInt : int { return $num;};getInt;//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…

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

try { non_exists_func();} catch { echo “Exception: {$e->getMessage();}n”;}//这里用php7试了一下还是没法捕获,但是看鸟哥介绍说是可行的。。。#Exception: Call to undefined function non_exists_func()

//PHP5class Collection {public function foreach {}}#Parse error: parse error, expecting `"identifier ”'...//PHP7class Collection { public function foreach {} public function in{} public function where{} public function order{}}$collection = new Collection();$collection->where->order();

差不多了,基本上就把自己对php7的初步了解说完了,其中肯定有很多不对的、低级的错误,希望各位兄弟及时指正,我好改一下,做个笔记!嘿嘿!

本文由澳门新葡8455手机版发布于计算机编程,转载请注明出处:浅谈php7的重大新特性_php技巧_脚本之家,7的步骤

上一篇:四则运算总计器示例,PHP实现的大约四则运算总 下一篇:没有了
猜你喜欢
热门排行
精彩图文