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')), ]);