变量处理机制修改
1.变量、属性和方法的引用都按照从左到右的顺序
$func_array = array("myfunc1","myfunc2");
//实际执行流程为 (this->$func_array)[0](),可是this->$func_array并不存在。
$this->$func_array[0]();
//想要强制改变顺序,需要使用大括号
$this->{$func_array[0]}()
2. global关键字只能引用简单变量
//不支持这种写法
global $$this->val;
//需要用大括号括起来
global ${$this->val};
3. 小括号把变量或函数括起来无效
function getArray() { return [1, 2, 3]; }
$last = array_pop((getArray()));
//依然有报错
4. 引用赋值自动创建数组元素或对象顺序和以前不同
$array = [];
$array["a"] = &$array["b"];
$array["b"] = 1;
var_dump($array);
//PHP7产生的数组:["a" => 1, "b" => 1]
//PHP5产生的数组:["b" => 1, "a" => 1]
list() 修改
1. list()按照顺序赋值
list($a, $b, $c) = [1, 2, 3];
// 得到的结果为 $a = 1; $b = 2; $c = 3;
2. 空list()不允许赋值
//错误写法
$list() = $a;
3. list()不再支持字符串拆分功能
//错误写法
$list(x,y) = "xy";
4. list()也适用于数组对象 ArrayObject
list($a, $b) = (object) new ArrayObject([0, 1]);
//$a = 0;$b = 1;
foreach() 修改
1. foreach()循环数组内部指针 current() 不再起作用
$array = [0, 1, 2];
foreach ($array as $val)
{
var_dump(current($array));
}
//将会输出三个0
2. foreach循环是对该数组的拷贝操作
$array = [0, 1, 2];
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}
//修改原数组,并不会影响循环过程,打印结果为 0,1,2
3. 使用引用循环,修改数组会受到影响
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
//追加的元素也会参与循环,打印结果为 0,1
参数处理机制
1. 重复参数命名不再支持
2. func_get_arg()和func_get_args()这两个方法返回参数当前的值,而不是传入时的值
function foo($x)
{
$x++;
var_dump(func_get_arg(0));
}
foo(1);
//打印结果为2
3. 打印异常信息也是修改后的值
function foo($x)
{
$x = 42;
throw new Exception;
}
foo("string");
PHP7的运行结果:Stack trace:
#0 file.php(4): foo(42)
#1 {main}
字符串处理机制
1. 含有十六进制的字符不再视为数字
//可以使用fliter_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)