PHP 7已经发布了不短的时间,也是PHP社区10多年来最激动人心的更新。新的引擎Zend Engine 3的“卖点”中最重要的就是性能、速度的提升。尽管引入了一些向后不兼容的更改,但是绝逼值得我们升级。
2016年7月10日(就在今天),官方的PHP5.5.X的版本前面就开始有一个“Old”开头了,按计划今年8月28日,5.6.X也不再更新了。
尽管有一些breaking changes,但是从5.5、5.6升到7,仍要比5.2升到5.3容易的多。熟悉PHP的开发者都知道为什么PHP会直接从v5跳到v7,v6想加入原生的Unicode支持,其实还有5.3就有的Closures以及Namespace等的特性,但是大约5年的时间最后都没有完成。最终标榜性能的分支phpng以PHP 7的身份公布于众。
下面我要给大家列一下PHP有哪些更新:
移除了不再建议使用的特性:
这些特性在使用的时候如果开启的错误级别较高的话,会触发E_DEPRECATED错误,PHP7将大量的特性直接移除不再能使用。
-
请更新逻辑和页面混合的老页面,移除不兼容的东西。
//PHP script tags <script language='php'> // code </script>
//PHP ASP tags <% // code %> Short tags <%=$str; %>
这些都不再支持,都改成
<?php
,<?=
和?>
-
更新POSIX-Compatible Regular Expressions
移除ereg拓展,移除下面的函数
ereg()
,eregi()
,ereg_replace()
,eregi_replace()
,split()
,spliti()
,sql_regcase()
. -
移除多个switch语句中default cases,之前的PHP是允许声明多个default cases,并且只有最后一个case执行。
switch($me) { default: echo 'ngshell'; break; default: // only this execute echo 'Yap'; break; }
-
移除了
ext/mysql
拓展,也就是说mysql_
开头的函数都不再可用。你可以用ext/mysqli
替换,当然支持用PDO。它们都支持prepared statements和调用stored procedures, 并且最重要的是支持sql占位符,更容易预防sql注入,更加安全。
一致变量语法
这个特性是针对构建复杂动态的表达式的时候如何解析所提出来的。
- 类似
$$ng['shell']
该表达式改如何解析呢?
Expr | PHP5 | PHP7 |
---|---|---|
$$ng['shell'] | ${$ng['shell']} | ($$ng)['shell'] |
$ng->$shell['ngshell'] | $ng->{$shell['ngshell']} | ($ng->$shell)['ngshell'] |
$ng->$shell['ngshell']() | $ng->{$shell['ngshell']}() | ($ng->$shell)['ngshell']() |
NgClass::$shell['ngshell'] | NgClass::{$shell['ngshell']} | (NgClass::$shell)['ngshell'] |
- Dereferencing任何有效的表达式
// access a array key
(expression)['ngshell']
// access a property
(expression)->ngshell
// call a method
(expression)->ngshell()
// access a static property
(expression)::$ngshell
// call a static property
(expression)::ngshell()
// call a callable
(expression)()
// access a char
(expression){0}
// dereferencing scalars
['classname', 'staticMethod']()
[$ngshellObj, "method"]()
'className'::staticMethod();
这些新的魔法的引进可能引发老代码很难调试的bug, 但是随着PHP7的普及,老的、写法不规范的会大量减少。
基本语言的改变
-
空组合
操作符??
// PHP 7 before
$ngshell = isset($_GET['ngshell']) ? $_GET['ngshell'] : 'shell';
// PHP 7
$ngshell = $_GET['ngshell'] ?? 'shell';
// fall-through
$ngshell = $_GET['ngshell'] ?? $_GET['shell'] ?? 'shell';
-
联合比较
操作符 (宇宙飞船操作符)
//PHP中第一个3位操作符。
// not return true or false, but -1, 0 or 1
// PHP 7 before
function sort_by_ngshell($a_shell, $b_shell) {
return ($a_shell < $b_shell) ? -1 : (($a_shell > $b_shell) ? 1 : 0)
}
// PHP 7
function sort_by_ngshell($a_shell, $b_shell) {
return $a_shell <=> $b_shell;
}
- 常量数组
define('shells', ['bash', 'fish', 'ksh', 'csh', 'zsh']);
echo shells[0];
const ngshell = ['ngshell'];
echo ngshell[0];
-
list()
解包实现ArrayAccess接口的对象
$array_like_obj = new ArrayObject(['bash', 'ngshell']);
list(, $ngshell) = $array_like_obj;
echo $ngshell;
- 新的函数
// intdiv()
var_dump(intdiv(3, 2));
//preg_replace_callback_array()
$bad_name = 'Ng-shell';
$new = preg_replace_callback_array(
[
'/^(\w+)-/' => function($matches) { return strtolower($matches[0]); },
'/-/' => function($matches) { return ''; },
],
$bad_name
);
echo $new;
// random_bytes() 和 random_int()
random_bytes(16)
random_int(0, 123456)
- 旧函数的改变
// session_start()
session_start([
'use_strict' => true;
'lazy_write' => false;
])
//加强安全的unserialize()
//dirname()
$path = '/shell/ngshell';
echo dirname($path, 2); // path: /
// password_hash() function deprecate salt parameter.
更可控的assertions
- 断言开启 2.断言关闭,可执行 3. 断言不回被编译0耗性能
更新了异常和错误的集成结构 加入了Throwable, 越来越像java。
Unicode 增强
PHP6夭折,不能说明php不支持unicode。
需要安装int扩展。
echo IntlChar::charName("\u{2603}");
Closure 增强
5.3开始支持Closure,5.4支持提前绑定$this
, 引进实例方法Closure->bindTo()
和静态方法Closure::bind()
两个方法其实是一样的,只是调用方式不一样。第二个方法很重要因为我们能动态改变Closure域。PHP7引进了实例方法Closure->call()
,了解javascript的同学很容易理解。如下:
class Ngshell {
private $version = '0.0.1';
}
$bindGeter = function($that) {
echo $that . ':' . $this->version;
};
$ngshell = new Ngshell();
$bindGeter->call($ngshell, 'NGSHELL');
// NGSHELL:0.0.1
Generator 增强
Generator是在PHP5.5的时候引入的,也是我特别喜欢的一个特性。面试的时候发现居然好多人都没听过 : )
PHP7支持return语句,并且可以用Generator->getReturn()
方法得到该值。还有支持Generator生成其他Generator。
面向对象的一些变更
不建议使用PHP4的构造函数,未来会彻底移除。
- Group use声明语句
use Ngshell\Router;
use Ngshell\ORM;
use Ngshell\View;
use Ngshell\{
Router,
ORM,
View,
function ngshell,
const NGSHELL
};
- 支持匿名class
$ngObject = new class($args) extends Ng implements Shell {
use Ngshell;
}
类型提示
PHP7最动人的一点无疑是标量类型提示,当然类型提示还包括return类型,严格类型等。
- 5.0 class/interface 类型提示
- 5.1 array 类型提示
- 5.4 callback 类型提示
- 7.0 bool, float, int, string
function ngshell(bool $b, float $f, int $i, string $s) {
// code
}
- 类型强制
function setHeader(int $statusCode, string $message) {
header('HTTP/1.1 ' . $statusCode . ' ' . $message);
}
setHeader(404, 'Not Found');
setHeader('200', 'OK'); // '200' 强制为 200
setHeader(502.98, 'Bad Gateway'); // 强制为 502,随在此处合理,但证明了类型强制会失去精度。
//严格类型模式
declare(strict_types=1)
namespace Ngshell\StrictTypes;
setHeader(502.98, 'Bad Gateway'); // 抛出\TypeError 异常
- 返回值类型提示
function add(int $a, int $b): int {
return $a + $b;
}
结束语
目前7.1都已经出了,大家赶紧升级吧!期待PHP发展越来越好,期待着PHP阵营加入更多的开发者。有好的社区才有好的未来。
网友评论