php7整理-处理机制方面
2020-03-23 11:00:13 来源:admin 点击:881
一、重复参数命名不再支持。
重复的参数命名不再支持。比如下面的代码执行的时候会报错:
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() .
PHP7整型处理就机制
一、无效八进制数字会报编译错误
无效的八进制数字(包含大于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)
PHP7对字符串的调整。
一、含有十六进制字符的字符串不再视为数字
含有十六进制字符的字符串不再视为数字,也不再区别对待。比如下面的代码:
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