PHP7语言新特性

变量处理机制修改

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)