zfxcms ^回到顶部

您的当前位置:首页 > php资讯 > PHP基础 > php7整理-语言修改方面

php7整理-语言修改方面

所属分类: PHP基础   2020-03-23 10:58:51  编辑:admin  浏览次数 545 次

一、间接变量、属性和方法引用都按照从左到右的顺序进行解释: 

 $$foo['bar']['baz'] // interpreted as ($$foo)['bar']['baz']

 $foo->$bar['baz']   // interpreted as ($foo->$bar)['baz']

 $foo->$bar['baz']() // interpreted as ($foo->$bar)['baz']()

 Foo::$bar['baz']()  // interpreted as (Foo::$bar)['baz']()

 如果想改变解释的顺序,可以使用大括号:

${$foo['bar']['baz']}

$foo->{$bar['baz']}

$foo->{$bar['baz']}()

Foo::{$bar['baz']}()

二、global关键字现在只能引用简单变量   

global $$foo->bar;    // 这种写法不支持。

global ${$foo->bar};  // 需用大括号来达到效果。

三、用括号把变量或者函数括起来没有用了

function getArray() { return [1, 2, 3]; }

$last = array_pop(getArray());

// Strict Standards: Only variables should be passed by reference

$last = array_pop((getArray()));

// Strict Standards: Only variables should be passed by reference

注意第二句的调用,是用圆括号包了起来,但还是报这个严格错误。之前版本的PHP是不会报这个错误的。

四、引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了。  

$array = [];

$array["a"] =& $array["b"];

$array["b"] = 1;

var_dump($array);

PHP7产生的数组:["a" => 1, "b" => 1]

PHP5产生的数组:["b" => 1, "a" => 1]

list()函数

一、list()不再按照相反的顺序赋值

list($array[], $array[], $array[]) = [1, 2, 3];

var_dump($array);

上面的代码会返回一个数组:$array == [1, 2, 3] 而不是之前的 [3, 2, 1]

注意:只是赋值的顺序发生变化,赋的值还是和原来一样的。

 list($a, $b, $c) = [1, 2, 3];

 // $a = 1; $b = 2; $c = 3;

和原来的行为还是一样的。

二、空的list()赋值不再允许。

list() = $a;

list(,,) = $a;

list($x, list(), $y) = $a;

上面的这些代码运行起来会报错了。

三、list()不在支持字符串拆分功能     

$string = "xy";

list($x, $y) = $string;

这段代码最终的结果是:$x == null and $y == null (不会有提示)

PHP5运行的结果是: $x == "x" and $y == "y". 

四、除此之外,list()现在也适用于数组对象:

list($a, $b) = (object) new ArrayObject([0, 1]);

PHP7结果:$a == 0 and $b == 1.

PHP5结果:$a == null and $b == null.

foreach函数

一、foreach()循环对数组内部指针不再起作用。

$array = [0, 1, 2];

foreach ($array as &$val)

{

    var_dump(current($array));

}

PHP7运行的结果会打印三次int(0),也就是说数组的内部指针并没有改变。

之前运行的结果会打印int(1), int(2)bool(false)

 二、按照值进行循环的时候,foreach是对该数组的拷贝操作

foreach按照值进行循环的时候(by-value)foreach是对该数组的一个拷贝进行操作。这样在循环过程中对数组做的修改是不会影响循环行为的。

$array = [0, 1, 2];

$ref =& $array; // Necessary to trigger the old behavior

foreach ($array as $val) {

    var_dump($val);

    unset($array[1]);

}

上面的代码虽然在循环中把数组的第二个元素unset掉,但PHP7还是会把三个元素打印出来:(0 1 2)

之前老版本的PHP会把1跳过,只打印(0 2).

三、按照引用进行循环的时候,对数组的修改会影响循环。

如果在循环的时候是引用的方式,对数组的修改会影响循环行为。不过PHP7版本优化了很多场景下面位置的维护。比如在循环时往数组中追加元素。

$array = [0];

foreach ($array as &$val) {

    var_dump($val);

    $array[1] = 1;

}

上面的代码中追加的元素也会参与循环,这样PHP7会打印"int(0) int(1)",老版本只会打印"int(0)"

内置函数的修改

substr()方法在边界切分的时候会返回一个空字符串,不再返回FALSE.

call_user_method() and call_user_method_array() 被删除了。

当一个输出缓冲是在另外一个输出缓冲处理器创建时,ob_start()返回E_RECOVERABLE_ERROR错误,不再返回E_RROR错误。

优化了内置的排序算法,对相等元素的排序可能和之前不同。

fpm-fcgi移除了dl()函数。

setcookie() 如果设置一个没有名字的cookie,会产生一个 WARNING错误,不再发送空的set-cookie 头信息。

  • parse_ini_file()parse_ini_string()scanner_mode参数增加了INI_SCANNER_TYPED选项。

  • unserialize()增加了第二个参数,可以用来指定接受的类列表。RFC: https://wiki.php.net/rfc/secure_unserialize

  • proc_open()打开的最大限制之前是写死的16,现在这个限制被移除了,最大数量取决于PHP可用的内存。windows版本增加了选项"blocking_pipes",可用来指定是否强制以块的方式读取。

  • array_column():The      function now supports an array of objects as well as two-dimensional      arrays

  • stream_context_create()windows下面可以接收array("pipe"      => array("blocking" => <boolean>))参数。

  • dirname()增加了可选项$levels,可以用来指定目录的层级。dirname(dirname($foo)) => dirname($foo, 2);

  • debug_zval_dump()打印的时候,使用int代替long,使用float代替double

下面的这些保留字不能用作类名、接口名和trait名。

bool
int
float
string
null
false
true

PHP文章检索

PHP文章目录