php7 参数、整形及字符串处理机制修改实例分析


Posted in PHP onMay 25, 2020

本文实例讲述了php7 参数、整形及字符串处理机制修改。分享给大家供大家参考,具体如下:

参数处理机制修改

一、重复参数命名不再支持。

重复的参数命名不再支持。比如下面的代码执行的时候会报错:

public function foo($a, $b, $unused, $unused) {
// ... 
}

编者按:应该没有人这样用吧。

二、func_get_arg和func_get_args()调整

func_get_arg()和func_get_args()这两个方法返回参数当前的值,而不是传入时的值。当前的值有可能会被修改  

function foo($x) {
   $x++;
   var_dump(func_get_arg(0));
}
foo(1);

上面的代码会打印2, 而不是1。如果想打印原始的值,调用的顺序调整下即可。

三、同样在打印异常回溯信息的时候也是显示修改后的值。

function foo($x) {  
 $x = 42;
 throw new Exception; 
} 
foo("string");

PHP7的运行结果:

Stack trace:
#0 file.php(4): foo(42)
#1 {main} 

PHP5的运行结果:

Stack trace:
#0 file.php(4): foo('string')
#1 {main}

这个调整不会影响代码的行为,不过在调试的时候需要注意这个变化。

其他和参数有关的函数都是同样的调整,比如debug_backtrace() .

整型处理机制修改

一、无效八进制数字会报编译错误

无效的八进制数字(包含大于7的数字)会报编译错误,比如下面的代码会报错:     

$i = 0781; // 8 is not a valid octal digit!
[点击并拖拽以移动]

老版本的PHP会把无效的数字忽略。

二、位移负的位置会产生异常

var_dump(1 >> -1); // ArithmeticError: Bit shift by negative number

三、左位移如果超出位数返回0

var_dump(1 << 64); // int(0)

老版本的PHP运行结果和cpu架构有关系。比如x86会返回1。

四、右位移超出会返回0或者-1.

var_dump(1 >> 64); // int(0)
var_dump(-1 >> 64); // int(-1)

字符串处理机制修改

一、含有十六进制字符的字符串不再视为数字

含有十六进制字符的字符串不再视为数字,也不再区别对待。比如下面的代码:

var_dump("0x123" == "291");   // bool(false)   (previously true) 
var_dump(is_numeric("0x123")); // bool(false)   (previously true) 
var_dump("0xe" + "0x1");    // int(0)     (previously 16) 
var_dump(substr("foo", "0x1")); // string(3) "foo" (previously "oo") 
// Notice: A non well formed numeric value encountered

可以使用filter_var函数来检查一个字符串是否包含十六进制字符或者是否可以转成一个整型

$str = "0xffff"; 
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX); 
if (false === $int) {   
throw new Exception("Invalid integer!"); 
}
var_dump($int); // int(65535)

二、\u{后面如果包含非法字符会报错

双引号和heredocs语法里面增加了unicode 码点转义语法,“\u{”后面必须是utf-8字符。如果是非utf-8字符,会报错:

$str = "\u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence

可以通过对第一个\进行转义来避免这种错误。

$str = "\\u{xyz}"; // Works fine

“\u”后面如果没有{,则没有影响:

$str = "\u202e"; // Works fine

PHP IntlChar()

PHP 7 通过 intl 扩展来支持国际化 (i18n) 和本地化 (l10n) 。此扩展仅仅是对 ICU 库的基础包装,并提供了和 ICU 库类似的方法和特性。

PHP 7 通过新的 IntlChar 类暴露出 ICU 中的 Unicode 字符特性。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。

实例

<?php 
printf('%x', IntlChar::CODEPOINT_MAX); 
echo IntlChar::charName('@'); 
var_dump(IntlChar::ispunct('!')); 
?>

以上程序执行输出结果为:

10ffff
COMMERCIAL AT
bool(true)

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 静态变量的初始化
Nov 15 PHP
理解PHP中的stdClass类
Apr 18 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
Oct 27 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
php常用的url处理函数总结
Nov 19 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
laravel5 Eloquent 实现事务方式
Oct 21 PHP
详解php反序列化
Jun 10 PHP
Nginx+php配置文件及原理解析
Dec 09 PHP
php7 错误处理机制修改实例分析
May 25 #PHP
php7 list()、session及其他模块的修改实例分析
May 25 #PHP
php7 新增功能实例总结
May 25 #PHP
PHP强制转化的形式整理
May 22 #PHP
Yii 框架入口脚本示例分析
May 19 #PHP
Yii 框架使用数据库(databases)的方法示例
May 19 #PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 #PHP
You might like
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
php单例模式的简单实现方法
2016/06/10 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
js实现碰撞检测
2021/01/29 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
python排序方法实例分析
2015/04/30 Python
Python过滤列表用法实例分析
2016/04/29 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
python快排算法详解
2019/03/04 Python
简单了解python的内存管理机制
2019/07/08 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
如何手工释放资源
2013/12/15 面试题
捷科时代的软件测试笔试题
2015/11/09 面试题
大一军训感言
2014/01/09 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
五年级语文教学反思
2014/01/30 职场文书
优秀教师个人材料
2014/12/15 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
浅谈mysql执行过程以及顺序
2021/05/12 MySQL