热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php7兼容spilit_PHP7不向下兼容部分Go语言中文社区

PHP7不向下兼容部分本文主要目标版本是7.1。1.类型声明PHP7下要求函数实参类型与声明了类型的形参类型一致。可以使用字符串(string),整数(int),浮点数(float

PHP7不向下兼容部分

本文主要目标版本是7.1。

1. 类型声明

PHP7下要求函数实参类型与声明了类型的形参类型一致。

可以使用字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool),数组(array),来声明函数的参数类型与函数返回值。

function s(string $a, array $b, int $c, float $d) {

echo "str a=$a c+d=".($c*$d).";n";

}

s([], [], 2, 3.8);//Fatal error: Uncaught TypeError: Argument 1 passed to s() must be of the type string, array given

s(1.4, [], 2, 3.8);//str a=1.4 c+d=7.6;

s('a2', '', 2, 3.8);//Fatal error: Uncaught TypeError: Argument 2 passed to s() must be of the type array, string given

s('a3', [], [], 3.8);//Fatal error: Uncaught TypeError: Argument 3 passed to s() must be of the type integer, array given

s('a4', [], '', 3.8);//Fatal error: Uncaught TypeError: Argument 3 passed to s() must be of the type integer, string given

s('a5', [], 2, []);//Fatal error: Uncaught TypeError: Argument 4 passed to s() must be of the type float, array given

s('a6', [], 2, '');//Fatal error: Uncaught TypeError: Argument 4 passed to s() must be of the type float, string given

s('a7', [], 2.9, 3.8);//str a=a7 c+d=7.6;//2.9被当做整形2处理

使用严格模式:declare(strict_types=1);

declare(strict_types=1);

function add(int $a, int $b): int {

return $a+$b;

}

echo add(1, 2);

echo add(1.9, 2.6);

php5是无法执行上面代码的,php7执行的时候会先输出一个3和一个报错( Argument 1 passed to add() must be of the type integer, float given);

标量类型声明 有两种模式: 强制 (默认) 和 严格模式。

declare(strict_types=1),必须放在文件的第一行执行代码,当前文件有效!

每个文件声明declare(strict_types=1)不是个理想的解决办法。

使用phan可以扫描出以上错误。

必须手动检查和修改。

intfloat不会fatal,但是会位数损失。int|flotstring|array会fatal。

grep -w int -rn ./ -rn | grep -w function | grep -v -e .git -e .js -e .html -e '@' -e .as | less

array使用很多:

grep -w array -rn ./ -rn | grep -w function | grep -v -e .git -e .js -e .html -e '@' -e .as -e 'array()' | less

float,double,string,bool使用无。

从phan的扫描结果中检查。

2. 类型声明后跨类型使用

PHP7下申明对象后,将对象当成另一种类型使用会报出Fatal错误。主要在array类型。

错误用法如下:

$wheres = '';

$wheres[] = ' 1 and aStatus=1';

以下用法是容忍的,会Notice或Warning,不会Fatal:

$a = 'a';

$a = 1;

$a = $a[1];// 返回空

$a = [3];

$a++;// 对数组++无效

必须手动检查和修改。

grep -w int -rn ./ -rn | grep -w function | grep -v -e .git -e .js -e .html -e '@' | less

可以从phan的扫描结果中检查。

3. 函数限制

PHP7不能使用同名的构造函数

PHP7实例方法不能用静态方法的方式调用

PHP7函数参数个数,调用的个数不满足声明的格式,会触发Fatal

function s(string $a, array $b) {

echo "str a=$a;n";

}

s(1);

//Uncaught ArgumentCountError: Too few arguments to function s()

需要手动检查。

从phan的扫描结果中检查。

4. 不兼容函数

4.1 mcrypt_系列被移除

mcrypt_generic_end()

mcrypt_ecb()

mcrypt_cbc()

mcrypt_cfb()

mcrypt_ofb()

搜索: mcrypt_*

grep mcrypt_ -rn ./ -rn | grep -v -e .git -e .js -e .html -e '@' -e .as | less

使用openssh系列替换。

4.2 set_exception_handler() 不再保证收到的一定是 Exception 对象

PHP5下原型是:

set_exception_handler(function (Exception $e) {…})

PHP7下原型是:

set_exception_handler(function (Throwable $e) {…})

4.3 set_magic_quotes_runtime 被移除

4.4 set_socket_blocking 被移除

librariesPHPExcelSharedPCLZippclzip.lib.php

librariesPHPMailerClient.php

4.5 split 被移除

4.6 imageps* 被移除

imagepsbbox()

imagepsencodefont()

imagepsextendfont()

imagepsfreefont()

imagepsloadfont()

imagepsslantfont()

imagepstext()

4.7 mktime()参数变化

mktime() gmmktime() 不再接受$is_dst参数

4.8 shmop_函数返回变化

shmop_open() The return type of shmop_open() has been changed from int to resource.

4.9 setlocale() 函数

不再接受 category 传入字符串。 应当使用 LC_* 常量。

4.10 xml_set_object

为了避免内存泄露,xml_set_object() 现在在执行结束时需要手动清除 $parse。

4.11 curl_setopt

curl_setopt 设置项CURLOPT_SAFE_UPLOAD变更:

TRUE 禁用 @ 前缀在 CURLOPT_POSTFIELDS 中发送文件。 意味着 @ 可以在字段中安全得使用了。 可使用 CURLFile作为上传的代替。

PHP 5.5.0 中添加,默认值 FALSE。 PHP 5.6.0 改默认值为 TRUE。. PHP 7 删除了此选项, 必须使用 CURLFile interface 来上传文件。

curl_setopt 中CURLOPT_HTTPHEADER变更:

值必须是array,否则会出发warning

4.12 preg_函数变化

preg_replace() 函数不再支持 “e” (PREG_REPLACE_EVAL). 应当使用 preg_replace_callback() 替代。

需要手动检查。

for file in `grep -w 'preg_replace' -rn * | grep -v -e '.js:' -e '.html:' -e '.css:' |awk -F ':' '{print $1}' | sort | uniq`; do echo grep "$file"; grep '/e' "$file" -n ; done

4.13 Eval option for mb_ereg_replace() and mb_eregi_replace()

4.14 xml_parser_free

xml_parser_free() is no longer sufficient to free the parser resource, if it references an object and this object references that parser resource. In this case it is necessary to additionally unset the $parser.

这个函数不能满足释放xml parser资源,需要用unset($parser)方法。

grep 'xml_parser_free' -rn ./ -rn | grep -v -e .git -e .js -e .html -e '@' -e .as | less

5 HTTP_RAW_POST_DATA

HTTP_RAW_POST_DATA替代为file_get_contents(‘php://input’)

grep -w HTTP_RAW_POST_DATA -rn ./ -rn | grep -v -e .git -e .js -e .html -e '@' -e .as | less

6 foreach 修改

foreach()循环对数组内部指针不再起作用

$arr = [1,2,3];

foreach ($arr as &$val) {

echo current($arr);// php7 全返回0

}

for i in `grep -w current -rn ./ -rn | grep -v -e .git -e .js -e .html -e '@' -e .as | grep 'current (' | awk -F ':' '{print $1}' | sort | uniq `; do echo $i; grep 'foreach.*&' $i -n ; done

按照值进行循环的时候, foreach是对该数组的拷贝操作

$arr = [1,2,3];

foreach ($arr as $val) {

unset($arr[1]);

}

var_dump($arr);

//最新的php7依旧会打印出[1,2,3]。(ps:7.0.0不行) 老的会打印出[1,3]

按照引用进行循环的时候, 对数组的修改会影响循环

$arr = [1];

foreach ($arr as $val) {

var_dump($val);

$arr[1]=2;

}

//最新的php7依旧会追加新增元素的循环。(ps:7.0.0不行)

7 list修改

不再按照相反的顺序赋值

//$arr将会是[1,2,3]而不是之前的[3,2,1]

list($arr[], $arr[], $arr[]) = [1,2,3];

不再支持字符串拆分功能。

// $x = null 并且 $y = null

$str = 'xy';

list($x, $y) = $str;

空的list()赋值不再允许,手动检查。

list() = [123];//php7不允许

grep 'list(' -rn ./ -rn | grep -v -e .git -e .js -e .html -e '@' -e .as | grep -w list | less

8 变量语法处理机制修改

对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析,而不是之前的混杂着几个特殊案例的情况。 下面这张表说明了这个解析顺序的变化。

引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了

$arr = [];

$arr['a'] = &$arr['b'];

$arr['b'] = 1;

// php7: ['a' => 1, 'b' => 1]

// php5: ['b' => 1, 'a' => 1]

需要手动检查。

9 其他

移除了ASP格式的支持和脚本语法的支持:

不支持重复参数命名

需要手动检查。

参考:

本文目标版本是7.1,更高版本要继续参考官方:



推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
author-avatar
mobiledu2502858407
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有