新特性:
Support for generators has been added via the yield keyword. Generators provide an easy way to implement simple iterators without the overhead or complexity of implementing a class that implements the Iterator interface.
try-catch blocks now support a finally block for code that should be run regardless of whether an exception has been thrown or not.
getMessage(), "\n";
} finally {
echo "First finally.\n";
}
try {
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
} finally {
echo "Second finally.\n";
}
// Continue execution
echo "Hello World\n";
?>
4. empty() 支持任意表达式
empty() 现在支持传入任意表达式,而不仅是一个变量。如:
新特性:
1. 可以使用表达式定义常量,及函数参数默认值。
2. 可以定义常量数组了: const ARR = ['a', 'b']
3. 可以使用 ...运算符定义变长参数函数了。
使用 ...运算符 将参数展开
4. 使用 ** 进行幂运算
5. use function;
use const
6. 可以多次打开并读取php://input
7. __debugInfo(); 当使用var_dump() 输出对象时,可以用来控制要输出的属性和 值
新增加的函数
mysqli_get_links_stats()
session_abort()
session_reset()
不兼容的地方:
1. 错误和异常处理:
在 PHP 7 中,很多致命错误以及可恢复的致命错误,都被转换为异常来处理了。 这些异常继承自 Error 类,此类实现了 Throwable 接口
$array=[0,1,2];
foreach($array as &$val){
var_dump(current($array));
}
//int(0)
//int(0)
//int(0)
2. foreach 通过值遍历时,操作的值为数组的副本
foreach 通过引用遍历时,有更好的迭代特性
当使用引用遍历数组时,在 foreach迭代能更好的跟踪变化
$array = [0];
foreach ($array as &$val) {
//foreach ($array as $val) {
var_dump($val);
$array[1] = 1;
}
int(0)
int(1)
或:
int(0)
3. 十六进制字符串不再被认为是数字
var_dump("0x123" == "291"); //bool(false)
var_dump(is_numeric("0x123")); //bool(false)
//var_dump("0xe" + "0x1"); //报错
//var_dump(substr("foo","0x1")); //报错
4. 所有ereg 系列函数被删掉了, PCRE作为推荐的替代品
5. yield 变更为右联接运算符
6. 在函数中检视参数值会返回 当前 的值:
当在函数代码中使用 func_get_arg() 或 func_get_args() 函数来检视参数值, 或者使用 debug_backtrace() 函数查看回溯跟踪, 以及在异常回溯中所报告的参数值是指参数当前的值(有可能是已经被函数内的代码改变过的值), 而不再是参数被传入函数时候的原始值了。
function foo($x) {
$x++;
var_dump(func_get_arg(0));
}
foo(1);
//int(2)
7. 不再提供 $HTTP_RAW_POST_DATA 变量。 请使用 php://input 作为替代。
8. 在 INI 文件中,不再支持以 # 开始的注释行, 请使用 ;(分号)来表示注释。
9. JSON 扩展已经被 JSOND 取代; 另外,空字符串不再被视作有效的 JSON 字符串
10. 在循环或者 switch 语句之外使用 break 和 continue 被视为编译型错误(之前视为运行时错误),会引发 E_COMPILE_ERROR 错误。
string; int ; float; bool;
返回值类型声明:
如果变量存在且值不为 NULL, 它就会返回自身的值,否则返回它的第二个操作数。
现在支持通过 new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类的定义
class A {private $x = 1;}
// PHP 7 之前版本的代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
echo $getX();
// PHP 7+ 及更高版本的代码
$getX = function() {
return $this->x;
//return 2;
};
echo $getX->call(new A);
//$getX();
// PHP 7 之前的代码
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+ 及更高版本的代码
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
9. 整数除法函数 intdiv()
10. session_start() 可以接受一个array 作为参数,用来覆盖php.ini 文件中设置的 会话配置选项。
11. preg_replace_callback_array()
在 PHP 7 之前,当使用 preg_replace_callback() 函数的时候, 由于针对每个正则表达式都要执行回调函数,可能导致过多的分支代码。 而使用新加的 preg_replace_callback_array() 函数, 可以使得代码更加简洁
现在,可以使用一个关联数组来对每个正则表达式注册回调函数, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值。
12. 新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数。
13. 可以使用list() 函数来展开实现了ArrayAccess接口的对象。
新特性:
1. 可为空(Nullable) 类型
参数以及返回值的类型现在可以通过在类型前加一个问号 ? 使之允许为空。当启用这个特性时,传入的参数或者 函数返回的结果 要么是给定的类型,要么是 null
// function testReturn(): ?string
// {
// return 'elePHPant';
// }
//
// var_dump(testReturn()); //string(9) "elePHPant"
function testReturn(): ?string
{
return null;
}
var_dump(testReturn()); //NULL
function test(?string $name)
{
var_dump($name);
}
test('elePHPant'); //string(9) "elePHPant"
test(null); // NULL
//test();
2. 返回void 函数
一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL 不是一个合法的返回值。
function swap(&$left, &$right) : void
{
if ($left === $right) {
return; //return null 会报错 error
}
$tmp = $left;
$left = $right;
$right = $tmp;
}
$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);
3. 现在支持设置 常量的可见性。
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
4. iterable 类型
现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。
5. 多异常捕获处理
一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。
6. list() 现在支持键名
现在list()和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)
$data = [
["id" => 1, "name" => 'Tom', 'xiao','er'],
["id" => 2, "name" => 'Fred'],
];
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
list( "name" => $name1, "id" => $id1,) = $data[0];
list( $name1, $id1,) = $data[0];
var_dump($name1);
// [] style
["id" => $id1, "name" => $name1] = $data[0];
// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
// logic here with $id and $name
}
// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
// logic here with $id and $name
}
7. 支持为负的字符串偏移量。
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
string(1) "e"
int(3)
8. Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
}
private function privateFunction($param)
{
var_dump($param);
}
}
$privFunc = (new Test)->exposeFunction();
$privFunc('some value');
新增的函数:
Session
session_create_id()
session_gc()
is_iterable()
当传递参数过少时将抛出错误。
在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生一个警告(warning)。 现在,这个警告被提升为一个错误异常(Error exception)。这个变更仅对用户定义的函数生效, 并不包含内置函数。
析构方法在一个不完整的对象(例如在构造方法中抛出一个异常)上将不再会被调用。
Variables bound to a closure via the use construct cannot use the same name as any superglobals, $this, or any parameter. For example, all of these function definition will result in a fatal error: