php7介绍
php7介绍
### 安装
实先删除原有的php包:
##查找php包
rpm -qa | grep php
##删除旧有的php包
rpm -e php包名称
以centos环境为例子,安装php7可以使用它官方自带的包进行安装。[安装方法](http://tecadmin.net/install-php-7-on-centos/)
如果您使用的是nginx,nginx相关的配置需要修改。
/etc/php-fpm.d/www.conf这个php-fpm的启动配置里面, 编辑里面的user和group为www 不然会报403错误。
nginx里面的网站配置中 fastcgi_pass 127.0.0.1:9001;和/etc/php-fpm.d/www.conf中的监听地址listen = 127.0.0.1:9001需要一致
sudo /etc/rc.d/init.d/php-fpm restart 重启php-fpm解析器
### 框架性能和升级
框架性能提升
![](/uploads/image/2016/11/06/20161106101157_26599.jpg)
thinkphp3.2能否平滑升级php7?
跑了一遍流程,基本ok。
钱包tp3.2性能对比
7.0版本耗时
![](/uploads/image/2016/11/06/20161106101242_34014.jpg)
5.5版本耗时
![](/uploads/image/2016/11/06/20161106101216_95217.jpg)
### 5.x到7.0的改变
php7中将mysql_*一系列扩展函数移除,然后使用pdo连接mysql。PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据
tp开启pdo模式 http://document.thinkphp.cn/manual_3_2.html#connect_db
可变变量。之前php5.x是按照从右往左解析表达式,建议对于一些有歧义的地方建议使用{}来明确执行顺序,方便迁移到php7.x. php7.x是从左往右解析表达式。
$first =['a'=>['aa'=>'b']];
$b = 'lala';
echo ${$first['a']['aa']};//结果为 lala
echo $first['a']['aa'];//php7中无法解析
call_user_method() 与 call_user_method_array()废除,修改为call_user_function() 与 call_user_method_function() 用法:
function a($b,$c)
{
echo $b;
echo $c;
}
call_user_func('a', "111","222");
call_user_func('a', "333","444");
一些在5.x版本中标记为过时Deprecated的函数,7.x中被删除了
< script language="php"> 这样的标签php7已经不支持了
静态调用一个非静态方法,会在静态调用中被提示未定义 $this ,并会报错。
class A {
public function test() { var_dump($this); }
}
// Note: Does NOT extend A
class B {
public function callNonStaticMethodOfA() { A::test(); }
}
(new B)->callNonStaticMethodOfA();
//php7中输出
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8
Notice: Undefined variable: this in /tmp/test.php on line 3
NULL
函数参数命名不允许相同。否则会报Fatal error (E_COMPILE_ERROR)。
function foo($a, $b, $unused, $unused) {
//
}
预定义变量$HTTP_RAW_POST_DATA(接受POST数据的)被移除,使用占用内存更少的php://input来实现. 接受除了 enctype="multipart/form-data" 类型以外的post请求
严格模式。文件最顶部 declare(strict_type=1); 或者php.ini里面开启。作用于函数调用和返回。strict_types指令只影响指定使用的文件,不会影响被它包含(通过include等方式)进来的其他文件(为了向下兼容)。
添加4种新的标量类型声明:int,float,string和bool (原来的是Closure和类实例). 用于函数的类型检查.
function sum(int $a, int $b) {
return $a + $b;
}
var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5)); //会报错
??操作符
$username = $_GET['user'] ?? 'nobody';
等于
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
太空船操作符 返回1 0 -1
`echo $a <=> $b;`
Array 可以用常亮来define了。PHP5.6 之后仅能通过 const 定义
`define('MYARRAY', ['a'=>1,'b'=>2]);`
use some\namespace{ClassA, ClassB, ClassC as C}; 一次性导入多个相同命名空间的类. 类似es6
可以读取Generator的最终返回值了。Generator里面可以嵌套另一个Generator。
匿名类 用后即焚. new class
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
错误(Error)和异常(Exception)处理的变更. Error exceptions会持续冒出直到匹配到对应的catch块。如果没有进行匹配,就会触发被设置的set_exception_handler()来执行处理,如果没有默认的异常处理程序,则该异常将被转换为一个致命错误,并且将被像一个传统的错误被处理. 继承关系图:
![](/uploads/image/2016/11/06/20161106101319_94367.jpg)
代码示例:
function add(int $left, int $right) {
return $left + $right;
}
try {
echo add('left', 'right');
} catch (Exception $e) {
// Handle exception
} catch (Error $e) { // Clearly a different type of object
// Log error and end gracefully
var_dump($e);
}
错误信息:
string(123) "Argument 1 passed to add() must be of the type integer, string given, called in /alidata/www/h
### 总结
总体感觉php7的执行效率提高很明显,tp被提升了30%左右。
5.x到7.x做到了平滑升级,并贴心的给出了迁移方案。不像python3和python2那样。好的迁移方案是一门语言得以快速发展和升级的前提。
7.x对类型检查和报错信息更加严格和规范了,有点像有静态属性的动态语言。学习了那种强类型语言的特性。
学习了es5, 增加了严格模式的选项。这样喜欢静态特性的人也可以用php7,喜欢动态特性的人可以关掉严格模式。