PHP7 从发布以来都是广受好评,PHP7是PHP脚本语言的重大版本更新,同时将带来大幅的性能改进和新的特性,以及改进一些过时功能。
主要的介绍一下PHP7后不支持以及废弃特性
一、PHP 7.1.x 中废弃的特性
1、ext/mcrypt
mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。
2、mb_ereg_replace()和mb_eregi_replace()的Eval选项
对于mb_ereg_replace()和mb_eregi_replace()的 e模式修饰符现在已被废弃。
二、PHP 7.2.x 中废弃的功能
1、不带引号的字符串
不带引号的字符串是不存在的全局常量,转化成他们自身的字符串。 在以前,该行为会产生 E_NOTICE,但现在会产生 E_WARNING。在下一个 PHP 主版本中,将抛出 Error 异常。
<?php var_dump(NONEXISTENT); /* Output: Warning: Use of undefined constant NONEXISTENT - assumed 'NONEXISTENT' (this will throw an Error in a future version of PHP) in %s on line %d string(11) "NONEXISTENT" */
2、png2wbmp() 和 jpeg2wbmp()
GD 扩展内的 png2wbmp() 和 jpeg2wbmp() 现已被废弃,将在下一个 PHP 主版本中移除。
3、INTL_IDNA_VARIANT_2003 转化
Intl 扩展废弃了 INTL_IDNA_VARIANT_2003 转化,为idn_to_ascii() 和 idn_to_utf8() 的默认选项。 PHP 7.4 会把默认值设置为 INTL_IDNA_VARIANT_UTS46, 并在下一个 PHP 主版本中完全移除 INTL_IDNA_VARIANT_2003。
4、__autoload() 方法
__autoload() 方法已被废弃, 因为和 spl_autoload_register() 相比功能较差 (因为无法链式处理多个 autoloader), 而且也无法在两种 autoloading 样式中配合使用。
5、track_errors ini 设置和 $php_errormsg 变量
当开启了 track_errors ini 设置,出现非致命错误时, 会在本地作用域创建 $php_errormsg 变量。 由于提供了更好的方式: error_get_last() 来获取此类错误信息,该功能被废弃。
6、create_function() 函数
考虑到此函数的安全隐患问题(它是 eval() 的瘦包装器),该过时的函数现在已被废弃。 更好的选择是匿名函数。
7、mbstring.func_overload ini 设置
由于此设置会影响环境中的字符串系列函数,带来相互操作中的问题,它现在已被废弃。
8、(unset) 类型强制转化
转化任意表达式为此类型,结果总是 NULL,所以这个多余的类型转化现在也就被废弃了。
9、parse_str() 不加第二个参数
使用 parse_str() 时,不加第二个参数会导致查询字符串参数导入当前符号表。 考虑到安全隐患问题,不加第二个参数使用 parse_str() 的行为已被废弃。 此函数的第二个选项为必填项,它使查询字符串转为 Array。
10、gmp_random() 函数
此函数基于未知的、取决于平台的 limb 尺寸产生随机数。因此,该函数已被废弃。 使用更好的方式产生随机数: GMP 扩展中的 gmp_random_bits() 和 gmp_random_range()。
11、each() 函数
使用此函数遍历时,比普通的 foreach 更慢, 并且给新语法的变化带来实现问题。因此它被废弃了。
12、assert() 一个字符串参数
assert() 字符串参数将要求它能被 eval() 执行。 考虑到可能被执行远程代码,废弃了字符串的 assert(),最好提供 bool 的表达式。
13、错误处理器内的 $errcontext 参数
$errcontext 参数包含了错误网站的所有本地变量。 考虑到它很少被用到,而且还会导致内部优化问题,它现在被废弃了。 代替用法:调试器应该自己取回错误站点的本地变量。
14、read_exif_data() 函数
read_exif_data() 别名已被废弃 使用 exif_read_data() 函数代替。
三、PHP 7.3.x 中废弃的功能
1、PHP 核心中废弃的功能
①大小写不敏感的常量
大小写不敏感的常量声明现已被废弃。将 TRUE 作为第三个参数传递给 define() 将会导致一个废弃警告。大小写不敏感的使用(在读取时使用一个与声明时不同的大小写方式)也已被废弃。
②命名空间中的 assert()
废弃:在一个命名空间中声明一个名为 assert() 的函数。 assert() 函数属于引擎特殊处理的情况,当在命名空间中使用相同名字去定义 函数时也许会导致不一致的行为。
③在字符串中搜索非字符串内容
废弃:将一个非字符串内容传递给字符串搜索函数。 在将来所有待搜索的内容都将被视为字符串,而不是 ASCII 编码值。如果需要依赖这个特性,你应该 要么显示地进行类型转换(转为字符串),或者显示地调用 chr()。 以下是受到影响的方法:
strpos() strrpos() stripos() strripos() strstr() strchr() strrchr() stristr()
④Strip-Tags Streaming
fgetss() 函数和 string.strip_tags stream filter 已经被废弃。这同样影响了 SplFileObject::fgetss() 方法和 gzgetss() 函数。
2、Data Filtering
对于 FILTER_FLAG_SCHEME_REQUIRED 和 FILTER_FLAG_HOST_REQUIRED 常量的显示使用已被废弃。 总之,FILTER_VALIDATE_URL 已经隐含了这两者。
3、图像处理和 GD 库
image2wbmp() 已被废弃。
4、国际化相关函数
如果 PHP 关联的ICU ≥ 56, 那么 Normalizer::NONE 形式的使用将会导致抛出一个废弃警告。
5、多字节字符串
以下在文档中不存在的 mbereg_*() 别名已被废弃。请使用相应的 mb_ereg_*() 变体替代。
mbregex_encoding() mbereg() mberegi() mbereg_replace() mberegi_replace() mbsplit() mbereg_match() mbereg_search() mbereg_search_pos() mbereg_search_regs() mbereg_search_init() mbereg_search_getregs() mbereg_search_getpos() mbereg_search_setpos()
6、ODBC 和 DB2 函数 (PDO_ODBC)
pdo_odbc.db2_instance_name ini 设置项在先前已被废弃。 它在文档中自 PHP 5.1.1 起被废弃。