PHP7新特性
1. 指定参数接收类型,格式: function 方法名(参数类型 $arg) { }
示例如: function abc(int $a) { echo $a; }
2. 函数,类函数 均增加支持返回值类型(基本类型如int,float,array等和自定义类名,自定义接口名),
function 方法名(参数, 参数可选): 返回值类型 { }
如:
function sum($a, $b): float { //返回浮点型数值
return $a + $b;
}
3. 参数类型验证级别声明
declare(strict_types=1); //如果是strict_types=1 类型的强制校验,strict_types=0不强制校验,只做简单验证
4. null合并运算符 ?? 如果变量值不为null则返回,否则返回第2个参数值
$username = $data['user'] ?? 'nobody';
等价
$username = isset($data['user']) ? $data['user'] : 'nobody';
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
5. 太空船操作符(组合比较符): <=> 两边值相等返回0,前面大于后面返回1,前面小于后面返回-1
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
6. define()函数定义常量值为数组
define('ALL_ENV', [
'dev',
'qa',
'test'
]);
echo ALL_ENV[1] . PHP_EOL; // 输出 "qa"
define("LOG_EVEL", "info");
echo LOG_EVEL . PHP_EOL; //info
echo LOG_EVEL[2] . PHP_EOL; //f
php5.6对应const常量可以定义为数组: const abc = ['a', 'hi'];
7. 支持匿名类: 用于创建一次性简单对象,http://php.net/manual/zh/language.oop5.anonymous.php
匿名类语法: new class {}
匿名类继承类: new class extends 类名 {}
匿名类实现接口: new class implements 接口名{ }
8. 闭包增加call方法: 闭包名->call(类对象); 这样就把闭包作为类对象的方法且被执行
9. 新增intl扩展(类名IntlChar): 用于操作多字符集的 unicode 字符, http://php.net/manual/zh/class.intlchar.php
10. 命名空间在php5.3开始就有,php7开始对同一个命名空间的导入的类、函数和常量可以通过单个 use 语句批量导入.
命名空间下可以定义: 类(包括普通类,抽象类和traits)、接口、函数和常量
命名空间下常量: const 常量名=值;
http://php.net/manual/zh/language.namespaces.importing.php
命名空间导入(php5.3开始就支持):
use My\Full\Classname类名 as Another别名;
use My\Full\Classname类名;
$obj = new namespace\Another; 表示实例化当前命名空间下的Another类
$obj = new Another; 表示实例化My\Full\Classname类
php5.6开始支持use导入单个函数:
use function My\Full\functionName命名空间下的方法名;
use function My\Full\functionName命名空间下的方法名 as func别名;
php5.6开始支持单个常量导入:
use const My\Full\CONSTANT命名空间下的常量名;
php7支持命名空间下的类,常量,方法批量导入:
批量导入类: use some\namespace\{ClassA类A, ClassB类B, ClassC类C as C别名};
批量导入方法: use function some\namespace\{fn_a, fn_b, fn_c};
批量导入常量: use const some\namespace\{ConstA, ConstB, ConstC};
11. 新增了一些方法 http://php.net/manual/zh/migration70.new-functions.php
整数除法函数: intdiv(除数, 被除数);返回int值
12. 新增了一些类,如ReflectionType等: http://php.net/manual/zh/migration70.classes.php
13. 新增了一些常量: http://php.net/manual/zh/migration70.constants.php
14. php的session_start([选项配置可选]);
该方法支持可选参数来配置sesion(php7之前是在php.ini或者在调用session_start()函数前用ini_set()来定义)
如: // 会话选项配置见: http://php.net/manual/zh/session.configuration.php
session_start([
'name'=>'token',
'use_cookies'=>0
'use_trans_sid'=>1,
]);
以上等价:
ini_set('session.name', 'token');
ini_set("session.use_cookies", 0);
ini_set("session.use_trans_sid", 1);
session_start();
15.php7支持** 运算符, <=>、**、?? 、\u{xxxx}操作符
echo 2 ** 3; //php7才支持
等价
echo pow(2, 3) . PHP_EOL;//php5和php7都支持
16. func_get_args()获取的是当前方法的所有参数值,但php5和php7有区别.如下:
test(123);//php5中是123, php7中是124
function test ($num) {
$num++;
var_dump(func_get_args()[0]);
//php5中是123, php7中是124 说明在php5中$num参数不能影响func_get_args的第1个参数
//php7中说明test方法的第1个参数值变化会影响func_get_args()的第1个参数
};
17. php7捕获错误
try {
echo helloJelly('1'); //调用未定义的函数, php7抛出Error级别错误捕获
} catch (Exception $e) {
echo 'Exception' . PHP_EOL;
} catch (Error $e) {
echo 'Error: 调用不存在的函数' . PHP_EOL;
}
php7废弃的特性
1. 16进制的字符串转换被废除了: 如php5中0x10和16是相等的,php7中是不相等的
//PHP5 是相等的
"0x10" == "16"
//PHP7中是不相等的
"0x10" != "16"
2. HTTP_RAW_POST_DATA移除了(可以使用file_get_contents("php://input");替代)
3. 短标记语法被移除: <?和 <? language=“php”这样的标签被移除了
4. 移除SAPIs的支持
5. 移除一些旧扩展,如PECL, mysql
6. 静态函数里面不再支持通过一个不兼容的$this调用一个非静态的函数了
7. $o = & new className{},不再支持这样的写法
8. php.ini文件移除了#作为注释,统一用;去注释
9. String、int、float等关键字不能被作为类名使用
10. preg_replace()不再支持匹配模式/e
11.移除一些函数,类,扩展等
other-上传区别
//PHP5
curl_setopt(ch, CURLOPT_POSTFIELDS,
array(
'file' => '@'.realpath('image.png'),
));
//PHP7
curl_setopt(ch, CURLOPT_POSTFIELDS,
[
'file' => new \CURLFile(realpath('image.png')),
]);